这个计划:
#include <stdio.h>
#include <conio.h>
int main()
{
printf("%d %d %d",1) ;
getch();
return 0;
}
给我结果1 0 0
而不是警告或错误或1
你能告诉我背后的逻辑吗?
我使用Visual Studio 2010编译此代码。
答案 0 :(得分:1)
这是未定义的行为,而不是您应该依赖的行为。使用printf ()
时如果没有提供足够且适当匹配的参数,就像在您的情况printf("%d %d %d",1)
中一样,C
没有定义在这种情况下应该发生什么,因此行为不是标准的或定义的
这可能会导致程序崩溃(如果printf ()
读取值的下一个内存地址无法访问或不存在)。
答案 1 :(得分:0)
printf并不关心是否有足够的参数。 “不关心”意味着它实际上并不检查格式列表中的项目数,以确保指定了足够数量的参数。
如果没有足够的参数,printf将只访问计算机内存(已使用的内存,指定了足够的参数)并使用那里的任何数据。
这是“未定义的行为”,结果会有所不同。这可能会导致您的程序崩溃(如果该位置的内存不可访问或不存在)。
你会发现这种事情在像C这样的语言中非常常见,在那里你可以做的事情应该被认为是“无效的”,但是编辑器会接受它。
答案 2 :(得分:0)
使用printf()
时,如果未提供的匹配参数不足,则结果为未定义的行为。
C没有定义在这种情况下会发生什么。
...如果格式的参数不足,则行为为 未定义。 ......C11§7.21.6.12
OP的代码显然打印了2个额外的int
,其值为0.为什么今天为0 - 查看编译的汇编语言。可能另一个代码编译具有相同的结果 - 也许 - 也许不是。它不是由语言定义的。