J'ai trouvé le code suivant:
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++);
if (count == zahl)
return 1;
return 0;
}
Le point de fonction est de vérifier si un nombre est un nombre premier ou non.
Je ne comprends pas pourquoi la boucle for a ;
à la fin:
v
for (count = 2; zahl % count != 0 && zahl >= count; count++);
Sans cela, le code ne fonctionne pas correctement.
Quelle est l'explication?
Cela signifie exactement la même chose que:
for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
Une boucle for a le mot clé for
, suivi de parenthèses contenant trois expressions facultatives séparées par des points-virgules, suivies d'un corps qui s'exécute à chaque itération de la boucle.
Le but de la boucle for dans votre exemple est de définir la valeur de count
, qui sera comparée à zahl
dans l'instruction if qui suit. Ceci est réalisé dans les expressions délimitées par des points-virgules, donc le corps de la boucle n'a rien à faire.
Comme la boucle n'a rien à faire, elle utilise l'instruction vide comme corps.
Si la ;
à la fin ont été omis et aucune autre modification n'a été apportée, puis l'instruction if après la boucle for deviendrait elle-même le corps de la boucle for. (Ce n'est pas prévu et cela briserait le programme, comme vous l'avez observé.)
Cependant, faire son corps en boucle se compose d'un seul ;
sur la même ligne n'est pas le seul moyen d'écrire un corps de boucle vide, ni probablement le moyen le plus sensé de le faire. Cela fonctionne parfaitement bien, mais le problème est que d'autres lecteurs - et peut-être le même programmeur, revenant au projet plus tard - peuvent se demander s'il s'agissait réellement d'une erreur. Après tout, on tape assez souvent des points-virgules à la fin des lignes lors du codage dans un langage de style C, il est donc facile d'en taper un supplémentaire là où il n'appartient pas.
L'autre problème est que, dans le code où une boucle d'une ligne avec ;
comme son corps est le style choisi, il est difficile de reconnaître quand quelqu'un en fait a a fait l'erreur de mettre un ;
quand on n'appartient pas.
Par conséquent, ces alternatives peuvent être préférables:
;
, en retrait, sur la ligne suivante - comme le suggère sh1{ }
, plutôt qu'une instruction videcontinue;
, qui fait simplement passer la boucle à sa prochaine itération (qui est la même que ce qui se passe lorsque le corps de la boucle est vide) - également comme le suggère sh1Le point-virgule à la fin de la boucle for signifie qu'il n'a pas de corps. Sans ce point-virgule, C pense que l'instruction if
est le corps de la boucle for.
La syntaxe de la boucle for
( instruction d'itération ) est
for ( clause-1 ; expression-2 ; expression-3 ) statement
statement
peut être une instruction null (;
). C11 6.8.3 dit
Une instruction null (composée uniquement d'un point-virgule) n'effectue aucune opération.
Au paragraphe 5, il donne un exemple
Dans le fragment de programme
char *s; /* ... */ while (*s++ != '\0') ;
ne instruction null est utilisée pour fournir un corps de boucle vide à l'instruction d'itération.
La même chose se passe dans
for (count = 2; zahl % count != 0 && zahl >= count; count++);
;
est utilisé pour fournir un corps de boucle vide à l'instruction for
. Sans pour autant ;
l'instruction à côté de la boucle for
sera considérée comme son corps et sera exécutée.
En plus de ce que disent déjà les autres excellentes réponses, je voudrais souligner que
for(count=2; zahl % count != 0 && zahl >= count; count++);
(c'est-à-dire une boucle for
avec une instruction vide utilisée pour incrémenter un "compteur") équivaut à
count=2;
while(zahl % count != 0 && zahl >= count)
{
count++;
}
cela rendrait l'objectif du code encore plus clair que certaines des alternatives répertoriées: si aucun commentaire n'est présent, comme dans le cas présenté, une boucle avec une instruction vide pourrait confondre un autre programmeur qui doit conserver ou utiliser le code (comme cela a été le cas avec l'OP ici).
Le contexte peut aider à discerner la véritable portée de l'instruction, mais entre une boucle for
avec une instruction vide et une boucle while
avec une instruction, cette dernière nécessite moins de travail pour comprendre sa portée.
L'instruction for est une instruction de boucle dont la structure permet une initialisation, un test d'expression et une modification de variable faciles. Il est très pratique pour créer des boucles contre-contrôlées. Voici la forme générale de l'instruction for:
for (initialize; test; step) statement
[...]
L'instruction null est simplement un point-virgule seul.
;
Une instruction null ne fait rien. Il ne stocke aucune valeur nulle part. Cela ne fait pas passer de temps lors de l'exécution de votre programme.
Le plus souvent, une instruction null est utilisée comme corps d'une instruction de boucle ou comme une ou plusieurs des expressions d'une instruction for. Voici un exemple d'une instruction for qui utilise l'instruction null comme corps de la boucle (et calcule également la racine carrée entière de n, juste pour le plaisir):
for (i = 1; i*i < n; i++) ;
Voici un autre exemple qui utilise l'instruction null comme corps d'une boucle for et produit également une sortie:
for (x = 1; x <= 5; printf ("x is now %d\n", x), x++) ;
Une instruction null est également parfois utilisée pour suivre une étiquette qui serait autrement la dernière chose dans un bloc.
Dans votre cas, le ;
est le Null Statement du for
Statement :
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++)
;
if (count == zahl)
return 1;
return 0;
}
Sans cela, le if
devient l'instruction for:
int func_prim (int zahl) {
int count;
if (zahl < 0)
return -1;
for (count = 2; zahl % count != 0 && zahl >= count; count++)
if (count == zahl)
return 1;
return 0;
}
Par conséquent, se comporter différemment.
Le ;
après la boucle for
signifie simplement que la boucle for
ne fera rien de plus que d'augmenter le compteur count
.
La boucle for n'est là que pour augmenter la valeur de count
.
une boucle for
aura (normalement) un corps,
où le corps est entouré d'accolades {
}
Cependant, pour un seul corps d'instruction, les accolades sont facultatives.
;
est une instruction vide.
En combinant ce qui précède, il devient évident que la boucle for
s'exécute jusqu'à ce que la condition devienne false
.
La boucle for fait essentiellement une boucle sur tous les nombres inférieurs ou égaux à zahl
mais supérieurs à 2 et les stocke dans la variable count
. En parcourant tous ces nombres, il vérifie si zahl
est divisible par count
. Si zahl
est divisible par count
, la boucle est arrêtée. Sinon, la boucle est arrêtée lorsque count
est égal à zahl
.
L'instruction if après la boucle for vérifie si count
est égal à zahl
. Si c'est le cas, cela doit signifier que la boucle a parcouru tous les nombres inférieurs à zahl
et supérieurs à 2. Cela signifie que zahl
est divisible par tous les nombres inférieurs à lui-même et supérieurs 2 , ce qui rend zahl
premier.