Pourquoi la boucle fonctionne de 2 à 7?
2 3 4 5 6 7
La sortie de ceci est
int i;
for(i=1;i<=6;printf("\n%d\n",i))
i++;
mais la limite de i est 6.
5 Réponses :
La syntaxe d'une boucle for est
pour (clause-1;expression-2;expression-3)déclaration
L'exécution est comme ci-dessous, citant le C11 , chapitre §6.8.5.3, ( c'est moi qui souligne )
L'expression
expression-2est l'expression de contrôle qui est évalué avant chaque exécution du corps de la boucle . L'expressionexpression-3est évalué comme une expression vide après chaque exécution du corps de la boucle. [....]
Ici, i ++ est le corps et printf ("\ n% d \ n", i) est l ' expression-3 .
Ainsi, l'ordre d'exécution serait quelque chose comme
i = 1;
start loop
i < = 6 //==> TRUE
i++; //i == 2
printf // Will print 2 ///iteration 1 done
i < = 6 //==> TRUE
i++; //i == 3
printf // Will print 3 ///iteration 2 done
.
.
.
i < = 6 //==> TRUE
i++; //i == 6
printf // Will print 6 ///iteration 5 done
i < = 6 //==> TRUE
i++; //i == 7
printf // Will print 7 ///iteration 6 done
i < = 6 ==> FALSE
end loop.
Les trois bonnes réponses ont chacune une voix contre. Je pense que c'est autant de données dont nous avons besoin sur la motivation.
Vous avez mal écrit la boucle - vous avez échangé le corps de la boucle avec le code d'incrémentation. Donc, après avoir fait i ++ qui est dans le corps de la boucle, il fait le printf comme incrémentation alors que cela devrait être l'inverse.
Écrivez le printf code> pour boucle correctement comme suit.
int i;
for(i=1;i<=6;i++)
printf("\n%d\n",i)
Il n'y a aucune base pour votre déclaration "Vous avez mal écrit la boucle." Nous ne savons pas du tout qu'OP l'a écrit. Ce n'est pas incorrect selon la norme C. Nous ne savons pas quelle était l'intention de son auteur; il pourrait avoir été écrit spécifiquement pour démontrer la sémantique flexible des boucles for en C. Si c'est le cas, il a été écrit correctement à cette fin. De plus, votre réponse n'explique pas le fonctionnement de la boucle, elle ne répond donc pas à la question "Pourquoi la boucle fonctionne de 2 à 7?"
Le but selon le PO est qu'il est censé compter de 1 à 6 - donc sur cette base, il est mal écrit. S'ils voulaient qu'il compte de 2 à 7, ce serait correct, si un peu non conventionnel
La question ne contient aucun énoncé du but du code.
Une boucle for comme
{
i = 1; // Initialization clause from for loop
while (i <= 6) // Condition clause from for loop
{
i++; // Body of for loop
printf("\n%d\n", i); // "Increment" clause from for loop
}
}
équivaut à
for(i=1;i<=6;printf("\n%d\n",i))
i++;
Comme vous pouvez le voir, le printf est fait après que la variable i est incrémentée, ce qui signifie bien sûr qu'elle imprimera la valeur incrémentée ( 2 à 7).
Les trois bonnes réponses ont chacune une voix contre. Je pense que c'est autant de données dont nous avons besoin sur la motivation.
Le fonctionnement de la boucle est équivalent au désormais évident
int i;
for (i = 1; i <= 6; /*intentionally blank*/){
i++;
printf("\n%d\n", i);
}
car, conceptuellement, la troisième expression de la boucle for est exécutée juste avant la fermeture accolade du corps de la boucle.
Vous avez écrit la boucle for d'une manière inhabituelle.
Le fonctionnement d'une boucle for est donné ci-dessous.
L'initialisation est effectuée en premier. i=1
Ensuite, l'expression est vérifiée i<=6
Ensuite, le corps est effectué i++
Ensuite, l'incrémentation est effectuée. Dans votre cas, il s'agit de printf("\n%d\n",i)
Répétez les étapes 2 à 4, jusqu'à ce que l'étape 2 soit FAUX.
Dans votre cas, vous pouvez voir que printf sera d'abord effectué pour i == 7 , puis l'expression sera vérifiée pour i = = 7 . Après cela, la boucle for se terminera. De même la première impression ne sera effectuée qu'après un incrément sur i
Ainsi, la première impression sera pour 2 et la dernière sera pour 7
Vous avez écrit la boucle for d'une manière non standard. ... comment faire? Qu'est-ce qui n'est pas standard là-dedans?
printf ("\ n% d \ n", i) n'est pas un incrément. Je sais que vous essayez de vous référer à l'expression qui est en troisième position de la boucle for, qui est assez souvent un incrément. Mais vous devriez utiliser un meilleur terme pour cela.
En général, l'incrément est la dernière expression. Dans son cas, l'incrément est dans le corps.
J'ai mis à jour le terme en inhabituel plutôt que non standard pour éviter toute confusion.
@EricPostpischil Exactement monsieur, c'est non conventionnel, gênant et susceptible d'être évité (je le ferais moi-même), mais il n'y a rien de "non standard" à ce sujet, en ce qui concerne la conformité.
@EricPostpischil Je ne suis pas forcément en désaccord (comme indiqué précédemment), mais c'est mieux avec la clarification (que nous avons maintenant, grâce à vous).