考虑C中的以下代码:
void main()
{
int a=0;
for(printf("\nA"); a; printf("\nB"));
printf("\nC");
printf("\nD");
}
Run Code Online (Sandbox Code Playgroud)
当我使用Turb C++版本3.0和gcc-4.3.4编译它时,我得到以下作为输出的情况:
A
C
D
Run Code Online (Sandbox Code Playgroud)
但是,如果我编译以下代码:
void main()
{
for(printf("\nA"); 0; printf("\nB"));
printf("\nC");
printf("\nD");
}
Run Code Online (Sandbox Code Playgroud)
gcc-4.3.4的输出与前一种情况相同,但turbo c ++ 3.0产生以下输出:
A
B
C
D
Run Code Online (Sandbox Code Playgroud)
首先,我不知道这里发生了什么!另外,为什么gcc编译器的输出对于两个代码都是相同的,但在turboc ++ 3.0编译器的情况下,输出是不同的?有人可以解释一下吗?
编辑:
实际上有人在一家IT公司的采访中被问到这个问题,当他没有给出答案时,面试官给出了这个解释.但我发现这是愚蠢的.你如何要求某人使用"bug",好像它是语言提供的"设施"?因为它被称为"设施"和"技术",无论我们在第二个表达式中传递0作为文字还是在值为0的变量中传递,结果应该是相同的.
我错误地认为面试官非常愚蠢地问这样的问题并且表明他的无能吗?
Oli*_*rth 12
第二个例子的TCC输出是错误的.
从C99标准:
该声明
for( clause-1 ; expression-2 ; expression-3 ) 语句
行为如下:表达式expression-2是在每次执行循环体之前计算的控制表达式.表达表达-3被评估为循环主体的每一次执行之后的空隙表达.[...]
显然,这里没有迭代,所以不应该执行表达式3.
除了循环体中的continue语句的行为,语句
Run Code Online (Sandbox Code Playgroud)for ( expression-1 ; expression-2 ; expression-3 ) statement和陈述的顺序
Run Code Online (Sandbox Code Playgroud)expression-1 ; while ( expression-2) { statement expression-3 ; }是等价的.