C输出背后的逻辑

C输出背后的逻辑,c,C,为什么下面程序的输出是 0 and Garbage Value and Garbage Value 计划是: #include<stdio.h> int main() { int a=9,b=0,x,y; x=a&b; y=a||b; printf("%d %d %d"); return 0; } #包括 int main() { int a=9,b=0,x,y; x=a&b; y=a | | b; printf(“%d%d%d”); 返回0; } 为什么%d第一次打

为什么下面程序的输出是

0 and Garbage Value and Garbage Value
计划是:

#include<stdio.h>
int main()
{

int a=9,b=0,x,y;
x=a&b;
y=a||b;
printf("%d %d %d");
return 0;
}
#包括
int main()
{
int a=9,b=0,x,y;
x=a&b;
y=a | | b;
printf(“%d%d%d”);
返回0;
}
为什么%d第一次打印0?

您的代码
printf(“%d%d%d”)调用未定义的行为

根据第7.19.6.1节,C99标准的fprintf功能:

fprintf函数在指定后续参数如何转换为输出的格式所指向的字符串的控制下,将输出写入流所指向的流如果格式的参数不足,则行为未定义。如果格式已用尽,而参数仍保留,则会计算多余的参数(一如既往),但会忽略多余的参数。遇到格式字符串结尾时,fprintf函数返回


此行为也适用于
printf()
函数(以及
sprintf()
snprintf()
函数)。

必须为
printf
函数提供参数,如下所示:

printf(“%d%d%d%d”,a,b,x,y)


如果不提供值,则行为未定义。这意味着它是不可重复的。您只是从内存中获取随机值,这些值不一定是特定值。

我认为用户问的不是如何正确使用printf,而是为什么第一个输出项是零而不是垃圾。这没关系。我的问题是如果不提供,那么为什么答案是0和垃圾。@user3177233-因为它的行为没有定义任何事情都有可能发生。您可以推理出UBs。输出不是
“0和垃圾值以及垃圾值”
,最多是
“垃圾值以及垃圾值以及垃圾值”