循环意外无限

时间:2016-10-23 10:18:01

标签: c for-loop

我是C语言的初学者,我正在尝试for循环,我遇到了一个无限循环,它不应该是一个无限循环,任何人都可以帮助我理解为什么它是一个无限循环

void main()
{
    int i;

    for(i=1,printf("Initialization");i++ <=5,printf("\nCondition");printf("%d",i))

    printf("\nInside the loop :");
}

虽然这不是一个无限循环

void main()
{
    int i;

    for(i=1,printf("Intialization");printf("\nCondition"),i++<= 5;printf("%d",i))

    printf("\nInside the loop\n");
}

4 个答案:

答案 0 :(得分:5)

原因是你的循环条件(两个分号之间)如下所示:

i++ <=5, printf("\nCondition") // First loop
printf("\nCondition"), i++<= 5 // Second loop

这两个条件都是逗号表达式,这意味着只有最后一部分在生成值方面很重要(不过这两个部分都有利于它们的副作用)。

在第一种情况下,整体条件结果是printf("\nCondition")返回的结果。它总是返回非零 * ,解释为&#34; true&#34;,所以循环是无限的。

在第二种情况下,总体结果是i++<=5返回的结果,它以&#34; true&#34;开始,变为&#34; false&#34;经过五次迭代。那是第二个循环终止的时候。

* 具体来说,printf返回打印的字符数,因此在您的情况下将为10.这对于理解循环无限的原因并不重要。

答案 1 :(得分:0)

你有2个条件记住printf返回打印的字符数,并且总是非零因此导致无限循环

答案 2 :(得分:0)

简单的逗号运算符实现操作数中的所有副作用,丢弃它的第一个操作数的结果,然后计算它的第二个操作数。因此,在第一个片段中,虽然i ++将被实现,条件&lt; =结果将被放弃,因此forf的有效条件将是printf(“\ nCondition”)的结果,即10 =真。在第二个片段中,第一个操作数结果printf(...)= 10将被丢弃,并将被用作纯条件,只需i <= 5。

这里有一些文档:

https://en.wikipedia.org/wiki/Comma_operator

https://uvesway.wordpress.com/2012/11/02/c-loops-for-and-the-comma-operator/

答案 3 :(得分:0)

如果我们在for循环条件中编写多个条件,编译器将检查所有条件,但它会考虑最合适的条件来检查条件是否为TRUE / FALSE。

在你的第一个程序中你写了两个条件,一个是i ++&lt; 5,printf(&#34; \ ncondition&#34;)。 printf总是返回该函数中的可打印字符数。因此每次printf在程序中返回9时,唯一的条件永远不会变为假。

但是在你的第二个程序中,你编写i ++&lt; 5是最正确的条件,当我的值变为5时,条件变为假,因此控制将出现在循环的一侧。 如果要检查printf是否返回可打印字符数,请尝试此操作。     在这里输入代码

  

unsigned int a = printf(&#34; HAI&#34;);

在这种情况下,printf将返回3到整数变量a