我这里有一个无限循环,但为什么呢?
int end = 5;
for(int i = 0; i < end, printf("at condition i=%d\n",i); ++i)
{
printf("inside i=%d\n",i);
}
我这里有一个无限循环,但为什么呢?
int end = 5;
for(int i = 0; i < end, printf("at condition i=%d\n",i); ++i)
{
printf("inside i=%d\n",i);
}
逗号运算符的左操作数被计算为 void 表达式,逗号运算符的计算结果是右操作数的结果。for
因此,循环的“if”部分查看 的结果printf
,它大于零,这意味着它永远不会结束。
您可以通过交换它们来修复它:
int end = 5;
for(int i = 0; printf("at condition i=%d\n",i), i < end; ++i)
{
printf("inside i=%d\n",i);
}
但更好的是根本不这样做。它不是很可读。
逗号运算符表达式i < end, printf("at condition i=%d\n",i)
用作条件。它的值是它的右操作数,也就是 的返回值printf
。
的返回值printf
是它输出的字符数,在这种情况下永远不会为零,所以它是一个无限循环。
如果用 编译-Wall
,
warning: left-hand operand of comma expression has no effect
所以i < end
没有效果。printf()
返回它打印的字符数。
根据返回值(此处为非零值),发生无限循环。
您需要了解逗号运算符。逗号表达式的结果是右操作数的结果。在控制表达式i < end, printf("at condition i=%d\n",i)
中,i < end
被评估并且其结果被丢弃。
因此,循环由表达式的值控制,该表达式printf("at condition i=%d\n",i)
返回它打印的字符数,因此它总是像true
这里一样评估并导致无限循环。
因为
1)i < end, printf("at condition i=%d\n",i)
返回与 相同的值printf("at condition i=%d\n",i)
。
2)printf()
返回打印字符的数量(在这种情况下不为零)
因此,循环中的条件始终为真。
在 expressioni < end, printf("at condition i=%d\n")
中,逗号操作符导致两个表达式按顺序进行求值,但第一个表达式的结果被丢弃,只使用 of 的结果printf
来控制循环。由于printf
该格式字符串将始终返回非零值,因此循环永远不会终止。
改用&&
:
for (int i = 0; i < end && printf("at condition i=%d\n"); i++)