以下代码如何工作 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 仍会找到值,但该值是随机的,因此您可能会得到一个随机值。
我想知道下面的程序是如何工作的?
#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 仍会找到值,但该值是随机的,因此您可能会得到一个随机值。