16

我参加的考试中有一道题。问题是:

以下代码的输出将是什么:

#include<stdio.h>
#include<conio.h>

void main()
{
 int a=5, b=6, c=7;
 printf("%d%d%d");
}

我的回答:它会发出警告,因为 printf 没有提供所需的参数。
如果你运行它,你会得到垃圾值。

老师给了我零。据他说,答案是这些值将以相反的顺序打印,即输出将是“765”。

问题是他使用的是 Turbo C++ 编译器,而我通常使用 GCC。我可以发表一些评论和解释以恢复我的分数吗?还是我的回答真的错了?

4

2 回答 2

25

这是一种未定义的行为,因此绝对可能发生任何事情。

局部变量实际上可能会被打印出来,因为在某些系统上,Xprintf函数族可能会从堆栈中弹出它们的参数(stdarg.h 工具可用于实现此类函数)。您的变量a,b,c可能恰好位于va_arg宏将从中提取参数的内存位置。这些是库实现/执行环境的细节,不是标准的一部分,因此它们可能因不同的目标平台而异。

fprintf这是来自 c99 标准描述函数的引用:

7.19.6.1 fprintf 函数

2/ fprintf 函数将输出写入 stream 指向的流,在 format 指向的字符串的控制下,该字符串指定后续参数如何转换为输出。如果格式的参数不足,则行为未定义。 如果格式已用尽而参数仍然存在,则评估多余的参数(一如既往),否则将被忽略。当遇到格式字符串的结尾时,fprintf 函数返回。

于 2012-10-30T06:48:24.367 回答
2

参数不匹配printf且不提供参数(如在这个问题中)是

undefined behaviour

它可能获得garbage或可能获得那些值a,b,c。它不是由语言标准定义的。

于 2012-10-30T06:51:45.000 回答