以下代码如何工作 printf("%c")?

How does the following code works printf("%c")?

我想知道下面的程序是如何工作的?

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

我不知道 printf("%c") 部分是如何工作的,因此整个 program.I 都知道写类似 printf("%c", 'a'); 的东西就像那样,但是如果不提供要打印的字符,它是如何工作的呢?我的问题是以下程序打印什么以及它是如何打印的?

我试过 运行 这个程序,有时它什么都不打印,但有时它打印一些随机字符后跟 1。我不明白它是如何工作的,有人可以解释一下吗是在代码后面,它是如何打印随机字符的,为什么最后会有一个字符?

这是我得到的一些输出

你有一个很棒的错误程序。

printf("%c") 尝试打印应该是第二个参数的单个字符。但是,由于您从未传递第二个参数,该函数会打印寄存器中 本应具有 第二个参数的任何内容。换句话说,一些随机字符。但是,它打印一个字符和 returns 1: 打印的字符数。

printf("%d",printf("%c")) 依次打印 1。现在你有一个随机字符后跟 1,并且由于外部 printf 也打印一个字符,它 returns 1.

最后,if(printf("%d",printf("%c"))) 将后面的 1 解释为 true 并中断循环。

欢迎使用未定义的行为。对于您指定的格式,您没有足够数量的参数,例如

C11 Standard - 7.21.6.1 The fprintf function(p2) "If there are insufficient arguments for the format, the behavior is undefined." 7.21.6.1(p9) "如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。"

这是关于格式错误的。

看这段代码,当执行printf("%d", 123)时,程序会将数字123压入栈中,然后压入字符串"%d",当printf遇到"%d"时,它将读取堆栈顶部的值,因此 printf 找到数字 123.

现在看这段代码,printf("%c"),程序会将字符串"%c"压入栈中,并尝试读取栈顶的值,你还没有压入一个值对于 printf,因此 printf 仍会找到值,但该值是随机的,因此您可能会得到一个随机值。