为什么C程序给出不同的结果?

sil*_*ash 16 c compiler-construction

在我参加的考试中有一个问题.问题是:

以下代码的输出结果如何:

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

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

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

老师给了我零.据他说,答案是价值将以相反的顺序打印,即输出将是"765".

问题是他正在使用Turbo C++编译器,我通常使用GCC.我可以得到一些评论和解释来取回我的分数吗?或者我的回答真的错了?

Mak*_*zin 25

这是一个未定义的行为,所以绝对会发生任何事情.

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

以下是c99标准描述fprintf函数的引用:

7.19.6.1 fprintf函数

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

  • 感谢@MaximSkurydin和所有其他人,现在我的老师已经同意我的答案是正确的,但现在我觉得他对我很生气,我将在期末考试中获得C级成绩.:(但是,谁在乎,我仍然喜欢编程. (7认同)
  • 不能保证`printf`将其参数从堆栈中弹出 - 或者存在"堆栈"这样的东西. (5认同)
  • 你是绝对正确的.我要说的就是要小心.更新了答案. (4认同)