为什么这不是无限循环?它是如何工作的?

Why this isn't an infinite loop? How is it working?

尝试使用此代码,根据我的书,输出是 -10 到 -1。这是如何打印的真的让我感到困惑。

#include <stdio.h>

void main() 
{ 
    int var = -10;
    for(; var; printf("%d\n ", var++));
} 

由于以下原因它正在工作

  • if条件中的var作为布尔表达式,对其值进行求值,任何非零值作为truezero 值作为 false.
  • var++ in printf("%d\n ", var++) 是应用于 var 的后缀运算符。它采用当前值,然后将 var 递增 1。
  • 最终var归零(连同第一点一起阅读)

通常在编程中,除了 0 之外的每个整数(到布尔值)都被解释为布尔值 true只有 0 被解释为 false,因此循环在 var = 0 处中断并且不会打印 0。 另外:如果您将任何正整数放入 var 和 运行 同一个循环中,循环将无限次计数,因为它永远不会达到 0,除非您等待溢出。也就是当你给2,147,483,647加1(增量)得到一个-2,147,483,648。从那以后 var 再次为负数但仍在向上计数,最终你达到 0 并且循环将中断。

这里你的代码有点格式化。请注意,以下代码与您的完全相同:

#include <stdio.h>
int main() 
{ 
    int var;

    for (var=-10; var!=0 ;var++) {
        printf("%d\n ", var);
    }
    return 0;
}

条件 var!=0 也会在您的代码中自动求值。在 C 中,所有 !=0 都是 true 并且 0false.

首先,var++表示var = var + 1; 这意味着循环从 -10 到 -1。 因此 printf("%d\n ", var++) 会将 var 递增 1 并打印 var。 var++ 和 ++var 之间的区别在于,在 var++ 中,printf 先发生,而不是 +1,因为你看到从 -10 到 -1 的输出。

其次,C中的0表示false。然后 var 变为 0 循环停止。

循环也可以是 for(int var = -10;var;printf("%d\n ", var++)) ;这与 for(;var;printf("%d\n ", var++)) ;

相同

让我们一步步来了解这个:

int var变量初始化为-10。到目前为止,还不错。

现在我们进入有趣的部分:for 循环。我们有一个具有以下形式的强大构造:

for (/* initialisation-statement */ ; /* condition */ ; /* iteration-statement */)
    /* statement or block of code */

对于您的代码,我们没有任何初始化语句(int var = -10 可以放在此处)、var 条件和 printf("%d\n ", var++) 迭代语句。

如果您不熟悉 for 的循环方式,这里有一个更原始(但仍然等效)的形式:

{
    /* initialisation-statement */;
startloop:
    if (/* condition */) {
        /* statement or block of code */
        /* iteration-statement */;
        goto startloop;
    }
}

for(int var = -10; var; printf("%d\n ", var++)); 代入其中,我们得到:

{
    int var = -10;
startloop:
    if (var) {
        ;
        printf("%d\n ", var++);
        goto startloop;
    }
}

执行printf("%d\n ", var++);语句时,会将var++的值打印到stdout++ 运算符的后缀版本递增该值,但求值为原始值。

因为 var 控制循环,所以只要计算结果为 true(非零),它就会继续循环。由于 var-10 递增,它将最终达到 0 并结束循环。

旁注:void main() 不是标准的。请改用 int main(void)int main(int argc, char *argv[])