我是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");
}
答案 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