Je voulais savoir comment fonctionne le programme suivant?

#include <stdio.h>
int main(void) {
    while(1){
        if(printf("%d",printf("%c")))
        break;
        else
        continue;
    }
    return 0;
}

Je ne savais pas comment fonctionne la partie printf ("% c") et donc tout le programme. Je suis conscient d'écrire quelque chose comme printf ("% c", 'a'); comme ça mais comment ça marche sans fournir le caractère à imprimer? Ma question est de savoir ce que le programme suivant imprime et comment s'imprime-t-il ainsi?

J'ai essayé d'exécuter le programme, parfois il n'imprime rien, mais parfois il imprime un caractère aléatoire suivi de 1. Je ne suis pas en mesure de comprendre comment cela fonctionne, quelqu'un peut-il s'il vous plaît expliquer ce qui se passe derrière le code et comment il est imprimer ces caractères aléatoires, et pourquoi il y en a un à la fin?

Voici quelques résultats que je reçois

Output

Output

-4
Atul Kumar 29 août 2020 à 08:21

3 réponses

Meilleure réponse

Un programme faux cool que vous avez.

printf("%c") tente d'imprimer un seul caractère censé être le deuxième paramètre. Cependant, comme vous n'avez jamais passé le deuxième paramètre, la fonction imprime ce qui est dans le registre qui était censé avoir le deuxième paramètre. En d'autres termes, un caractère aléatoire. Cependant, il imprime un caractère et renvoie 1: le nombre de caractères imprimés.

Ce 1 est à son tour imprimé par printf("%d",printf("%c")). Vous avez maintenant un caractère aléatoire suivi de 1, et comme le printf extérieur imprime également un caractère, il renvoie 1.

Enfin, if(printf("%d",printf("%c"))) interprète que plus tard 1 comme vrai et rompt la boucle.

2
DYZ 29 août 2020 à 05:44

Il s'agit de bogues de format.

Regardez ce code, lors de l'exécution de printf ("% d", 123), le programme poussera le numéro 123 sur la pile, puis poussera la chaîne "% d", lorsque printf rencontrera "% d", il lira la valeur sur le haut de la pile, donc printf trouve le numéro 123.

Maintenant, regardez ce code, printf ("% c"), le programme va pousser la chaîne "% c" sur la pile, et essayez de lire la valeur en haut de la pile, vous n'avez pas poussé une valeur pour printf, donc printf trouvera toujours une valeur, mais la valeur est aléatoire, vous pouvez donc obtenir une valeur aléatoire.

0
coolder 13 sept. 2020 à 12:07

Bienvenue dans Undefined Behavior . Vous ne disposez pas d'un nombre suffisant d'arguments pour le format que vous spécifiez, par exemple

C11 Standard - 7.21.6.1 La fonction fprintf (p2) " S'il n'y a pas suffisamment d'arguments pour le format, le comportement n'est pas défini. " 7.21.6.1 (p9)" Si une spécification de conversion n'est pas valide, le comportement n'est pas défini. Si un argument n'est pas du type correct pour la spécification de conversion correspondante , le comportement n'est pas défini. "

3
David C. Rankin 29 août 2020 à 05:33