需要帮助理解这对C中的循环代码

fin*_*ity 10 c

考虑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.

同样,在C90标准中(或至少在我发现草案中),它说:

除了循环体中的continue语句的行为,语句

     for (  expression-1 ;  expression-2 ;  expression-3 )  statement
Run Code Online (Sandbox Code Playgroud)

和陈述的顺序

      expression-1 ;
     while ( expression-2) {
               statement
              expression-3 ;
     }
Run Code Online (Sandbox Code Playgroud)

是等价的.