【发布时间】:2012-06-20 15:41:19
【问题描述】:
考虑下面的 C 代码:
void main()
{
int a=0;
for(printf("\nA"); a; printf("\nB"));
printf("\nC");
printf("\nD");
}
当我使用 Turb C++ 3.0 版和 gcc-4.3.4 编译它时,在这两种情况下我都会得到以下输出:
A
C
D
但是,如果我编译以下代码:
void main()
{
for(printf("\nA"); 0; printf("\nB"));
printf("\nC");
printf("\nD");
}
gcc-4.3.4 的输出与前一种情况相同,但 turbo c++ 3.0 产生以下输出:
A
B
C
D
首先,我不知道这里发生了什么!另外,为什么 gcc 编译器的输出对于两个代码是相同的,但是在 turboc++ 3.0 编译器的情况下,输出是不同的?有人可以解释一下吗?
编辑:
其实有人在某IT公司的面试中被问到这个问题,当他没有给出答案时,面试官给出了这个解释。但我觉得这很愚蠢。您如何要求某人使用“错误”,就好像它是该语言提供的“设施”一样?为了将其称为“设施”和“技术”,无论我们在第二个表达式中将 0 作为文字传递还是作为值为 0 的变量传递,结果都应该是相同的。
我认为面试官很愚蠢地提出这样的问题并且表明他的无能是错误的吗?
【问题讨论】:
-
这是编译器中一个有趣的区别,但是为什么你首先要使用那种
for循环呢? -
@ThomasPadron-McCarthy 实际上,语法很好。它似乎没有任何用处,但它完全有效,就像“我的感冒是脚趾”这句话在句法上完全有效,但却是一个无意义的短语。第一部分,
printf("\nA"),将在循环开始时执行;哨兵表达式导致循环在计算结果为 false/0 时停止执行,它是第一个(== 0)的a和第二个的文字0; [续] -
@Naveen:很明显,它是在其中找到奇怪的错误。
-
[cont.] 最后一部分,
printf("\nB"),通常在循环的每次迭代结束时执行,根本不应该执行,因为哨兵评估为 0 开始,并且在 3/4 的情况下是这种情况。 -
这是一个编译器错误。关于 10 多年前
Turbo C++ 3.0的这种奇怪行为,人们可以在 Internet 上找到更多类似的问题。甚至for (;0;) statement;也会让statement执行。请注意,TC++ 3.0 来自一个大多数 DOS 编译器不符合标准的时代,甚至实施了不兼容的扩展只是为了锁定他们的用户(例如 TC++ 与 MSC)。
标签: c