我参加考试时遇到了一个问题。问题是:
以下代码的输出结果如何:
#include<stdio.h>
#include<conio.h>
void main()
{
int a=5, b=6, c=7;
printf("%d%d%d");
}
我的回答:它会发出警告,因为printf没有提供所需的参数 如果你将运行它,你将获得垃圾值。
老师给了我零。根据他的说法,答案是价值将以相反的顺序打印,即输出为“765”。问题是他正在使用Turbo C ++编译器,我通常使用GCC。我可以得到一些评论和解释来取回我的分数吗?或者我的答案真的错了吗?
答案 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
。
它不是由语言标准定义的。