gpt4 book ai didi

c - 需要帮助理解 C 中的循环代码

转载 作者:太空宇宙 更新时间:2023-11-04 00:07:19 25 4
gpt4 key购买 nike

考虑以下 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 的变量传递,结果应该是相同的。

我是否认为面试官问这样的问题很愚蠢并且表明他无能是错误的?

最佳答案

第二个例子的 TCC 输出是错误的。

来自 C99 标准:

The statement

for ( clause-1 ; expression-2 ; expression-3 ) statement

behaves as follows: The expression expression-2 is the controlling expression that is evaluated before each execution of the loop body. The expression expression-3 is evaluated as a void expression after each execution of the loop body. [...]

显然,这里没有迭代,所以永远不应该执行 expression-3

类似地,在 C90 标准中(或至少在 draft that I found 中),它说:

Except for the behavior of a continue statement in the loop body, the statement

     for (  expression-1 ;  expression-2 ;  expression-3 )  statement

and the sequence of statements

      expression-1 ;
while ( expression-2) {
statement
expression-3 ;
}

are equivalent.

关于c - 需要帮助理解 C 中的循环代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18533789/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com