printf的参数数量错误会导致奇怪的结果

#include  int main() { int i=10,j=20; printf("%d%d%d",i,j); printf("%d",i,j); return 0; } 

使用Turbo C编译器,输出如下:

 10 10 garbageValue

 20

有人可以解释为什么会这样吗?

您使用的是哪种编译器? 我在turbo c v2.0和turbo c ++ v 4.5编译器上测试了它,输出是

 10 20 garbage value 10 

这是您将获得的实际输出,因为您只使用两个变量和三个格式说明符。 因此它将打印存储在两个变量中的值并打印垃圾值。

在第二种情况下,您只使用一个格式说明符和两个变量,因此在这种情况下,它只会打印存储在变量中的一个值并跳过另一个变量。 如果在turbo c 2.0和turbo c ++ 4.5编译器下编译它,你可能得到上面的输出。

printf()的第一次调用有一个太多的格式说明符,导致未定义的行为。 在这种情况下,打印垃圾值。

 printf("%d%d%d",i,j); => 

你告诉printf打印三个整数,但你只提供三个,所以printf从堆栈中打印出一些垃圾。 另一个:

 printf("%d",i,j); 

应该只取一个整数,但你传递的是两个。 C语言不能防止这样的错误,并且发生的事情是完全未定义的,所以要解释你如何确切地看到这些输出是困难的,除非你知道你的编译器是内部的,并且由于该代码是错误的并且预计会失败而没有那么有用。

行为未定义 ,这意味着语言规范没有说明在这种情况下会发生什么。 它完全取决于编译器的实现和系统架构。 解释未定义的行为偶尔会有趣,经常令人发狂,而且几乎总是没用 – 所以不要担心它!

您的格式说明符全部混淆了,我认为您发布的代码不是您的实际代码。 在我的Visual Studio编译器上,我看到:

 1020010 

每个%d表示printf应插入一个整数值的位置。

 printf("%d%d%d",i,j); 

你告诉printf期待三个,但你只给了两个。 Turbo C可能会使用引擎下的参数做一些不同的事情,但您仍然需要将您的格式说明符与您的参数匹配:

 printf("%d%d",i,j);