【发布时间】:2012-10-30 06:47:04
【问题描述】:
我参加的考试中有一道题。问题是:
以下代码的输出是什么:
#include<stdio.h>
#include<conio.h>
void main()
{
int a=5, b=6, c=7;
printf("%d%d%d");
}
我的回答:它会发出警告,因为 printf 没有提供所需的参数。
如果你运行它,你会得到垃圾值。
老师给了我零。据他说,答案是这些值将以相反的顺序打印,即输出将是“765”。
问题是他使用的是 Turbo C++ 编译器,而我通常使用 GCC。我可以有一些 cmets 和解释来拿回我的分数吗?还是我的回答真的错了?
【问题讨论】:
-
你的老师依赖于函数,它使用堆栈上的最后三个值,最后三个是你声明的三个变量。这是未定义的行为(包括
void main部分),所以它可以做任何事情。 -
你完全正确,你的老师是个混蛋。
-
另外,告诉你的老师,我刚刚在我的 iPad 上尝试过,它没有打印
765。 -
你甚至可以告诉他,如果他在优化的情况下进行编译,变量将简单地消失,因为编译器可能会意识到它们没有被使用。
-
你的老师没有资格教授 C 编程。没有资格的人会教使用
void main(),因为它不是有效的 C(在托管系统上),没有资格的人会使用 Turbo C,因为它不遵循 C 标准,没有资格的人会在 C++ 编译器上编译 C 代码,特别是,没有人有资格教人们研究结果未定义的行为。是毫无意义的知识,是对每个人时间的巨大浪费。知道某事是未定义的行为就足够了。