Le code est tiré d'une question d'examen pour laquelle je ne connaissais pas la réponse:
int c = 0;
while (c < 5)
{
if (c == 2)
{
continue;
}
printf ("data %d", ++c);
}
Je sais qu'il n'imprime rien, mais j'aimerais savoir pourquoi?
Toute aide serait appréciée.
3 Réponses :
Une fois que c == 2 est vrai, vous resterez dans la boucle et continuerez d'appuyer sur l'instruction if. Ainsi, vous n'incrémenterez jamais une fois que c est défini sur 2.
int c = 2;
if(c == 2) {
continue;
}
printf("%d", c); // this will never get hit once c is 2 since continue will
//make the program jump to the next iteration of the loop.
//Also by not flushing after the print, you aren't clearing the buffer and are then not accepting the next print.
Vous n'avez pas besoin de fflush (stdout) si le La boucle infinie est cependant corrigée.
Il y a quelques problèmes de mise en mémoire tampon. Si vous ajoutez fflush (stdout) après printf , vous obtenez data 1data 2 . Cela ne va pas plus loin que data2 car une fois que c est égal à 2, il continuera à frapper la casse if et à sauter l'incrément. Essayez ce qui suit et vous obtiendrez data 1data 2 :
int c = 0;
while (c < 5)
{
if (c == 2)
{
continue;
}
printf ("data %d", ++c);
fflush(stdout);
}
Par défaut, sur les systèmes POSIX, Ajoutez Après cela, votre programme sera bloqué dans une boucle infinie, car la condition de votre instruction stdout est un flux mis en mémoire tampon qui ne se videra que lorsqu'il atteindra un saut de ligne ou lorsqu'il lui sera explicitement demandé de vider en utilisant fflush (stdout); code> fflush (stdout); après l'appel de printf () et votre programme devrait afficher: data 1data 2
while sera toujours évaluée à true .
exécutez-le sur papier étape par étape
@Ballen Abdullah Il y a une boucle infinie. :) La sortie sera data 1data 2
Je l'ai exécuté dans un compilateur et il n'imprime rien. Je pensais que ce serait aussi les données 1data 2, mais ce n'était pas le cas. Je ne sais pas pourquoi il n'imprime absolument rien. Ne devrait-il pas au moins imprimer les données 1?
Je penserais à
data 1data 2, mais il pourrait être coincé dans le tampon de sortie.Après printf, essayez fflush (stdout); voir ce qui se passe ..
Après la ligne printf, ajoutez
fflush (stdout);pour vous assurer qu'il est réellement imprimé avant que le programme continue. De cette façon, vous pouvez être sûr de ne pas avoir de problèmes de mise en mémoire tampon.Mettez un
\ nà la fin de la chaîne de format, ou unfflush (stdout)après leprintfsi vous voulez voir la sortie. Sinon, la sortie se termine dans le tampon de sortie et y reste car le code entre dans une boucle infinie.Si vous mettez
++ c;juste avant lecontinue;, cela corrigera la boucle infinie. Ensuite, le vidage est à peu près inutile, car le tampon de sortie sera vidé à la fin du programme. J'obtiensdata 1data 2data 4data 5.