下面的代码是如何工作的printf(";%c";)?

下面的代码是如何工作的printf(";%c";)?,c,if-statement,output,printf,C,If Statement,Output,Printf,我想知道下面的程序是如何工作的 #include <stdio.h> int main(void) { while(1){ if(printf("%d",printf("%c"))) break; else continue; } return 0; } #包括 内部主(空){ 而(1){ 如果(printf(“%d”,printf(“%c”)) 打破 其

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

#include <stdio.h>
int main(void) {
    while(1){
        if(printf("%d",printf("%c")))
        break;
        else
        continue;
    }
    return 0;
}
#包括
内部主(空){
而(1){
如果(printf(“%d”,printf(“%c”))
打破
其他的
持续
}
返回0;
}
我不知道部分printf(“%c”)是如何工作的,因此也不知道整个程序;像那样,但是如果不提供要打印的字符,它是如何工作的呢?我的问题是下面的程序打印什么?它是如何打印的

我试着运行这个程序,有时它什么也不打印,但有时它会打印一些随机字符,后跟1。我无法了解它是如何工作的,有人能解释一下代码背后的内容吗?它是如何打印这些随机字符的,以及为什么最后会有一个

下面是我得到的一些输出

你有一个很酷的错误程序

printf(“%c”)
尝试打印假定为第二个参数的单个字符。但是,由于您从未传递过第二个参数,因此该函数将打印寄存器中本应具有第二个参数的内容。换句话说,一些随机字符。但是,它打印一个字符并返回1:打印的字符数

1依次由
printf(“%d”,printf(“%c”)
打印。现在有一个随机字符后跟1,因为外部的
printf
也打印一个字符,所以它返回1

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

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


“如果格式参数不足,则行为未定义。”“如果转换规范无效,则行为未定义。如果任何参数不是相应转换规范的正确类型,则行为未定义。”

这是关于格式错误的

看看这段代码,当执行printf(“%d”,123)时,程序将把数字123推到堆栈上,然后推字符串“%d”,当printf遇到“%d”时,它将读取堆栈顶部的值,因此printf将找到数字123


现在看看这段代码,printf(“%c”),程序将把字符串“%c”推到堆栈上,并尝试读取堆栈顶部的值,您还没有为printf推送值,所以printf仍然会找到值,但该值是随机的,所以您可能会得到一个随机值。

您正在调用未定义的行为:它似乎只起作用,但它已损坏。内部
printf
调用缺少一个参数:
printf(“%c”)
格式需要一个整数参数,该参数以字符形式打印。例如,
printf(“%c”,“x”)
将是有效的。您的编译器应该已经向您发出警告(如果没有,请考虑提高警告级别)。节省时间-启用更多警告以快速检测
printf(“%c”)
是问题代码。