-3
votes

Pour la boucle: faire incrémenter et accéder à une boucle

Je ne sais pas pourquoi cela me donne des ordures: xxx pré>

qui me donne: p> xxx pré>

Les indices ont l'air correcte et Même l'affectation à l'intérieur de la boucle est correcte (par exemple, printf ("% i \ n", a [0]) code> donne 1 code> qui est correct, après la boucle). Mais à l'intérieur du corps de la boucle, le Printf, malgré les indices corrects, donne des valeurs erronées (quelques ordures). Pourquoi est-ce? P>

éditer, après quelques réponses avec ... && (a [i] = i) code>, j'ai essayé de le faire avec d'autres déclarations: P >

warning: value computed is not used [-Wunused-value]
   i++ && printf("%i\n",a[i])


16 commentaires

"Donne des valeurs erronées" - Quelles sont les valeurs correctes ?


1,2,3,4,5,6,7,8,9,10


Savez-vous que le fait que a [] n'est pas initialisé! Donc, il contient de bonnes valeurs détruites!


Vous imprimez d'abord une valeur non initialisée et n'attribuez qu'une valeur valide.


vous faites a [i-1] = i après vous l'avez imprimé, de manière aussi tardive


Mais pourquoi, si j'imprime après la boucle par exemple printf ("% i \ n", a [0]) obtenez 1 ?


@milanhrabos in pour (A; b; c) {corps] Le formulaire C est effectué après l'exécution du corps, et vous définissez chaque entrée en C mais imprimez-la dans le corps


@bruno vous a raison. J'ai donc essayé de donner une valeur à A [0] = 1 avant la boucle (ainsi d'initialiser le premier élément, le reste donne le i ) mais en vain


@milanhrabos également votre code est "compliqué" car vous augmentez i trop tôt dans la partie de test plutôt que dans la partie C


@milanhrabos J'ai mis une réponse avec une méthode "standard", mais aussi un moyen de ne pas mettre l'initialisation de la matrice dans le corps du pour mais je ne recommande pas de faire ça ^^


@bruno pourquoi est possible de traiter l'affectation comme une condition "vraie" (après && )?


@milanhrabos Une affectation Valeurs de la valeur attribuée (à partir d'une coulée éventuelle), donc l'affectation de 1 puis 2 puis 3 etc il n'est jamais 0 (supposons sans débordement) si jamais fausse. regarde ma réponse pour un autre cas


@milanhrabos a lu ma réponse et vous comprendrez pourquoi mais qui n'imprime rien


@bruno, pourquoi y a-t-il toujours de la lutte de qui donner le score plus? Vous êtes tous assez expérimentés et avez beaucoup de score, mais il y a toujours les combats, je ne l'obtiens pas. Le Stackoverflow devrait donner une solution pour mettre fin à cette guerre sans fin. Je vous le donnerai, mais la raison était que j'attendais d'améliorer ma propre solution, que p__j__ a fait comme premier. Mais oui, vous avez ajouté cela aussi. Ok, pour cette période


@bruno, je n'ai que 50 points, mais ne me soucie pas. Vous avez plus de 24k réputation et vous voulez toujours plus, alors quel est le point? Quelle est la motivation de cela? Cela n'a pas de sens


@milanhrabos est à la fois de jouer et également si vous choisissez une réponse qui signifie que le choisi est le "meilleur" => Les gens écrivant d'autres réponses peuvent être d'accord avec cela (et parfois une autre réponse, même je me réponds) ou ne comprenez pas pourquoi, et considère que ce n'est pas "juste". Notez que vous pouvez également UV l'autre réponse (s) pour remercier leur auteur


3 Réponses :


2
votes

faire

for(int i = 0; (i < sizeof(a)/sizeof(*a)) && (a[i]=i+1); ++i) {
  printf("%i:%i\n", i, a[i]);
}


2 commentaires

Voir mon édition s'il vous plaît. J'ai changé la dernière expression dans la tête, mais n'imprime rien. Comment résoudre ce problème?


@milanhrabos relire ma réponse où je dis: Remarque (a [i] = i + 1) n'est pas faux car les valeurs au moins 1, au cas où vous vouliez faire a [i] = i le test à utiliser peut être (i ne pas être faux quand i est 0



0
votes

A pour boucle est composé de 4 parties:

  1. Initialisation
  2. condition
  3. Code corporel
  4. action

    Exemple: xxx

    L'ordre d'exécution est tel que je l'énuméra ci-dessus.

    dans votre exemple, < Pré> xxx

    1. Initialisation - i = 1
    2. condition - i ++ <10; -> 0 <10 = true , i = 1
    3. Code corporel - printf tandis que i = 1 , a [0] est toujours inaitalisé !
    4. action - a [i-1] = i , a [0] = 1 (uniquement maintenant a [0] est initialisé !

0 commentaires

0
votes

Dans votre code, vous exécutez d'abord le code entre crochets, puis vous affectez le tableau. Il doit être fait la bonne voie opposée. XXX

HTTPS: / /godbolt.org/z/r-dvji

ou meilleur xxx


6 commentaires

pour (int i = 0; i ++ <10 && (i-1] = i); printf ("% i \ n", [I-1])); est le meilleur option


Je ne savais pas que je peux assigner comme une "vraie" condition, semble comme une magie


@milanhrabos en fait dans la première option (non existante dans la réponse), j'ai commis une erreur. Généralement c'est un UB


Voir mon édition. J'ai changé la dernière expression en boucle, mais en vain


i ++ doit aller de la condition


pourquoi faut-il? Je ne peux pas augmenter chaque fois que je veux? (Et donc à la fin de la boucle de corps, comme de l'expression du patauge dans la boucle du corps)?