1
votes

Je voudrais connaître la raison de la sortie du terminal pour ce code dans une question d'examen pour C

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.

c

8 commentaires

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 un fflush (stdout) après le printf si 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 le continue; , 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'obtiens data 1data 2data 4data 5 .


3 Réponses :


1
votes

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.


0 commentaires

1
votes

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);
}


0 commentaires

2
votes

Par défaut, sur les systèmes POSIX, 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>

Ajoutez fflush (stdout); après l'appel de printf () et votre programme devrait afficher:

data 1data 2

Après cela, votre programme sera bloqué dans une boucle infinie, car la condition de votre instruction while sera toujours évaluée à true .

p>


0 commentaires