10
votes

Effet du point-virgule après "pour" boucle

Dites que je veux imprimer un message en C cinq fois en utilisant un pour boucle. Pourquoi si j'ajoute un point-virgule après la boucle comme ceci: xxx

Le message n'est pas imprimé 5 fois, mais si je ne mettez pas le point-virgule là-bas?


0 commentaires

6 Réponses :


11
votes
for (i=0;i<5;i++){}

0 commentaires

26
votes

Semicolon est une déclaration légitime appelée déclaration null * Cela signifie "ne rien faire". Puisque la boucle pour exécute une seule opération (qui pourrait être un bloc ci-joint dans le point-virgule {} ) est traité comme le corps de la boucle, entraînant le comportement que vous avez observé .

Le code suivant xxx

est interprété comme suit:

  • Répétez cinq fois pour (i = 0; i <5; i ++)
  • ... ne rien faire (Semicolon)
  • Ouvrez une nouvelle portée des variables locales {
  • ... Imprimer "Bonjour"
  • Fermer la portée }

    Comme vous pouvez le constater, l'opération qui est répétée est ; , pas le printf .


    *

    voir K & R , Section 1.5.2


5 commentaires

Le point-virgule n'est pas un "opérateur". Il termine une "déclaration", et elle est valable pour que la déclaration ne contienne rien. Certains compilateurs avertissent de cela parce que c'est une erreur courante. Bretelles vides {} est le moyen préféré de ne rien faire.


Semicolon est un ponctuateur mais pas un opérateur .


@ams s'il vous plaît voir une édition. J'avais tort de l'appeler un opérateur, c'est une déclaration (au moins selon K & R)


@ouah s'il vous plaît voir une édition. J'avais tort de l'appeler un opérateur, c'est une déclaration (au moins selon K & R)


@Sergeykalinichenko Il y a des gens répétitifs et il y a des personnes répétitives. :-)



3
votes

La déclaration consistant à seulement le ; code> jeton est appelée la déclaration null em> et cela ne fait que ... rien.

Par exemple, ceci est valide:

if (bla)
    ;
else
    ;


0 commentaires

1
votes

Ce code ci-dessous imprimera "Bonjour" 5 fois ..

    for(i=0;i<5,printf("Hello\n");i++);


1 commentaires

En fait, non qui n'imprime pas Bonjour 5 fois; Il imprimera bonjour un nombre indéfiniment élevé de fois. C'est parce que la condition est i <5, printf ("Hello \ n"); et l'opérateur de la virgule évalue son LHS ( i <5 ) et ignore le résultat, puis évalue le RHS ( printf ("Hello \ n") ), qui retourne 6 car il écrit 6 caractères à la sortie standard; Parce que 6 est vrai (ce n'est pas zéro), la boucle continue, indéfiniment. Avec mes options de compilateur par défaut pour GCC (y compris -werror ), le code ne compile pas: Erreur: l'opérande de gauche de la virgule n'a aucun effet [-werror = valeur inutilisée] .



0
votes

De nombreux compilateurs affichent une erreur de syntaxe lorsque vous mettez un point-virgule après un point-virgule après une boucle pour la boucle, mais selon le compilateur GCC (Linux) ou Dev-CPP, vous pouvez mettre un point-virgule après une boucle pour boucle et ne vous montrera aucune erreur.

Par exemple p> xxx pré>

ou p> xxx pré>

de l'exemple ci-dessus, il est clair si nous mettons des accolades vierges ou un point-virgule après boucle qui signifie que nous n'avons pas encore entré de variables. p>

viens maintenant à votre question.
Si vous souhaitez imprimer bonjour cinq fois, vous devez écrire votre programme comme P>

for(int i=0;i<5;i++)
{
    printf("hello");
}


0 commentaires

0
votes
#include <stdio.h>
    
int main() {
    int sum = 0; // variable initialization  
    int k = 1;  
    //for(int i = 1; i <= 10; i++);
    {
        sum = sum + k;  
        k++;
    }  
    printf("The  value of sum is %d", sum);  
    return 0;
}
if there is a semicolon after for loop then code in the curly braces is treated as regular body and will be executed normally.In the above program I have commented the for loop and it does the same thing as putting ; at the end of the for loop. It prints the sum as 1 because code inside the curly braces executes once.

1 commentaires

'{' est en ligne avec commenté la boucle. C'est la raison pour laquelle il n'a pas compilé. Veuillez essayer maintenant avec le code mis à jour.