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

时间:2012-10-30 06:47:05

标签: c compiler-construction

我参加考试时遇到了一个问题。问题是:

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:25)

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

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

以下是来自c99标准的引用,描述了fprintf函数:

  

7.19.6.1 fprintf功能

     

2 / fprintf函数将输出写入指向的流   流,在格式指向的字符串的控制下   指定后续参数如何转换为输出。 如果有的话   对于格式的参数不足,行为未定义。   如果参数保留时格式已用尽,则超出   参数被评估(一如既往)但被忽略。该   fprintf函数在格式字符串结尾时返回   遇到。

答案 1 :(得分:2)

printf中的参数不匹配且不提供任何参数(如本问题所示)是

undefined behaviour

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