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

时间:2017-04-27 07:29:17

标签: c for-loop boolean type-conversion infinite-loop

尝试此代码并按照我的书输出为-10到-1。如何打印这真是让我感到困惑。

#include <stdio.h>

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

5 个答案:

答案 0 :(得分:3)

让我们一步一步地完成这个步骤:

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[])

答案 1 :(得分:1)

这是出于以下原因

  • if条件中的var用作布尔表达式,评估其值,任何非零值用作 true 值用作 false
  • var++中的
  • printf("%d\n ", var++)var上应用的后缀运算符。它取当前值,然后将var递增一。
  • 最终var达到零(与第一点一起阅读)

答案 2 :(得分:1)

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

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

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

条件var!=0也将在您的代码中自动评估。在C中,!=0true0false

答案 3 :(得分:0)

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

答案 4 :(得分:0)

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

第二,C中的0表示错误。然后var变为0,循环停止。

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

相同