Qu'est-ce que la pleine la boucle “for” syntaxe en C?
J'ai vu quelques très bizarre for
boucles lors de la lecture d'autres personnes de code. J'ai été à la recherche pour une complète explication de syntaxe pour la for
boucle dans C
mais il est très difficile parce que le mot "for
" apparaît dans des phrases sans rapport avec ce qui rendait la recherche presque impossible pour Google de manière efficace.
Cette question est venue à mon esprit après la lecture de ce fil qui m'a rendu curieux de nouveau.
La for
ici:
for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);
Dans le milieu de la condition il y a une virgule pour séparer les deux morceaux de code, qu'est-ce virgule faire? La virgule sur le côté droit, je comprends qu'il rend à la fois a>>=1
et b<<=1
.
Mais à l'intérieur d'une condition de sortie de boucle, ce qui se passe? Ne quittez lorsque le p==0
, quand a==1
ou lorsque les deux se produire?
Ce serait génial si quelqu'un pouvait m'aider à comprendre le présent et peut-être me pointer dans la direction d'un plein for
boucle description de la syntaxe.
- Vous avez corrigé "un peu" à "genre de", "coma" à "virgule", capitalisés sur les "I" et "T", mais "de gauche "ppl" pour les gens?
- Correction de certaines erreurs. Post a l'air beaucoup mieux maintenant. Question intéressante.
Vous devez vous connecter pour publier un commentaire.
La virgule n'est pas exclusive de boucles; c'est l'opérateur virgule.
fera d'abord a, puis b, alors x est réglé à la valeur de b.
La syntaxe est:
Qui est un peu (en ignorant
continue
etbreak
pour l'instant) équivalent à:Donc votre exemple de boucle for est (ignorant encore
continue
etbreak
) équivalent àQui agit comme si elle était (encore une fois ignorant
continue
etbreak
):Deux détails supplémentaires de la boucle for qui n'étaient pas dans la simplification de la conversion à une boucle while ci-dessus:
true
(résultant en une boucle infinie, à moins qu'unbreak
,goto
, ou quelque chose d'autre casse la boucle).continue
actes comme si c'était un goto vers un label juste avant l'incrémentation, à la différence d'uncontinue
dans la boucle while qui serait ignorer l'incrément.Aussi, un détail important sur l'opérateur virgule: c'est un point de séquence, comme
&&
et||
(c'est pourquoi je peux le couper en états séparés et garder son sens intact).Changements dans C99
Le standard C99 introduit un couple de nuances pour ne pas mentionné plus tôt dans cette explication (qui est très bon pour C89/C90).
Tout d'abord, toutes les boucles sont des blocs dans leur propre droit. Effectivement,
est lui-même enveloppé dans une paire de bretelles
La norme sayeth:
Ceci est également décrit dans la Justification en termes de jeu supplémentaire de croisillons.
Deuxièmement, la
init
partie en C99 peut être un (unique) de la déclaration, comme dansÀ présent, le "bloc enroulé autour de la boucle' vient dans sa propre; cela explique pourquoi la variable
i
ne sont pas accessibles en dehors de la boucle. Vous pouvez déclarer plusieurs variables, mais ils doivent tous être du même type:La norme sayeth:
La virgule simplement sépare les deux expressions et est valable n'importe où dans C, où une expression normale est autorisée. Ces activités sont exécutées dans l'ordre de gauche à droite. La valeur de la partie droite de l'expression est la valeur de l'expression globale.
for
boucles se composent de trois parties, tout ce qui peut également être vide; l'une (la première) est exécuté au début, et une (la troisième) à la fin de chaque itération. Ces pièces généralement initialiser et incrémenter un compteur, respectivement; mais elles ne peuvent rien faire.La deuxième partie est un test qui est exécuté au début de chaque exécution. Si le test retourne
false
, la boucle est annulée. C'est tout là est à lui.Le style C pour la boucle se compose de trois expressions:
Chacune de ces parties peut être une expression valide dans la langue que vous écrivez de la boucle. Cela signifie qu'ils peuvent être utilisés de manière plus créative. Tout ce que vous voulez faire à l'avance peut aller dans l'initialiseur, tout ce que vous voulez faire entre les deux peut aller dans la condition ou le comptoir, jusqu'au point où la boucle n'a pas de corps.
Pour y parvenir, l'opérateur virgule est très pratique. Il permet à la chaîne d'expressions ensemble pour former une seule expression. La plupart du temps il est utilisé de cette façon dans une boucle for, les autres conséquences de l'opérateur virgule (par exemple, la valeur d'affectation des considérations) jouent un rôle mineur.
Même si vous pouvez faire des choses intelligentes en utilisant une syntaxe de façon créative - je voudrais rester à l'écart jusqu'à ce que je trouve un vraiment bonne raison de le faire. Lecture de code de golf avec des boucles rend le code plus difficile à lire et à comprendre (et de maintenir).
La wikipédia a une belle article sur la boucle for ainsi.
for
boucle admis dans lacounter
section, ce qui permettrait à des boucles for imbriquées à être défini de la même déclaration? En d'autres termes, comment est un composé pour la boucle définie en C/C++?Tout est facultatif dans un
for
boucle. Nous pouvons initialiser plusieurs variables, nous pouvons vérifier pour plus d'une condition, nous pouvons itérer plus d'une variable à l'aide de l'opérateur virgule.Suivantes
for
boucle vous emmène dans une boucle infinie. Être prudent en vérifier l'état.Konrad mentionné le point essentiel que je voudrais répéter: La valeur de la partie droite de l'expression est la valeur de l'expression globale.
Un compilateur Gnu a déclaré cet avertissement lorsque j'ai mis les deux tests dans la "condition" de la section de la boucle for
Ce que j'ai vraiment destiné pour la "condition" a été deux tests avec un "&&" entre les deux. Par Konrad déclaration, seul le test sur la droite de la virgule aurait une incidence sur l'état.
overall expression.
"? Je suppose que vous voulez dire "La valeur de la partie droite de l'expression est la valeur de l'ensemble descomma expression
" ?pour la boucle est de l'exécution pour une occasion particulière(;;)
la syntex pour pour boucle
for(;;)
OU
for (initialisation; condition; compteur)
e.g (rmv=1;rmv<=15;rmv++)
exécution à 15 fois pour bloquer
1.première initializ la valeur parce que commencer avec la valeur
(e.g)rmv=1 ou rmv=2
2.deuxième déclaration, c'est de tester la condition est vraie ou fausse ,la condition vraie.de temps d'exécution de la boucle for et la condition est fausse résilier pour le bloc,
e.g i=5;i<=10 la condition est vraie
3.la troisième est d'incrémenter ou de décrémenter
(e.g)rmv++ ou ++rmv
inline monospace
comme cela, utiliser " au début et à la fin du texte que vous voulez de monospace.for(;;)
n'est pas autre syntaxe, c'est normal, la syntaxe, avec sauté de l'initialiseur, la condition et le compteur.