web-dev-qa-db-fra.com

Quel est le but de ";" à la fin de la boucle for?

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?

77
Wien95

Cela signifie exactement la même chose que:

for(count = 2; zahl % count != 0 && zahl >= count; count++)
{
}
87
M.M

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:

  • mettre le ;, en retrait, sur la ligne suivante - comme le suggère sh1
  • écrire le corps de la boucle comme un bloc vide, { }, plutôt qu'une instruction vide
  • faire du corps de boucle un continue;, 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 sh1
54
Eliah Kagan

Le 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.

42
Rohn Adams

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.

23
haccks

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.

18
Federico

for Instruction :

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

[...]

déclaration nulle :

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.

13
falsarella

Le ; après la boucle for signifie simplement que la boucle for ne fera rien de plus que d'augmenter le compteur count.

13
user4826588

La boucle for n'est là que pour augmenter la valeur de count.

11
bmpasini

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.

10
user3629249

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.

7
Ace