2

我这里有一个无限循环,但为什么呢?

int end = 5;
for(int i = 0; i < end, printf("at condition i=%d\n",i); ++i) 
{
    printf("inside i=%d\n",i);
}
4

6 回答 6

6

逗号运算符的左操作数被计算为 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);
}

但更好的是根本不这样做。它不是很可读。

于 2014-06-26T12:12:01.517 回答
4

逗号运算符表达式i < end, printf("at condition i=%d\n",i)用作条件。它的值是它的右操作数,也就是 的返回值printf

的返回值printf是它输出的字符数,在这种情况下永远不会为零,所以它是一个无限循环。

于 2014-06-26T12:12:41.837 回答
2

如果用 编译-Wall

warning: left-hand operand of comma expression has no effect

所以i < end没有效果。printf()返回它打印的字符数。
根据返回值(此处为非零值),发生无限循环。

于 2014-06-26T12:11:25.577 回答
2

您需要了解逗号运算符。逗号表达式的结果是右操作数的结果。在控制表达式i < end, printf("at condition i=%d\n",i)中,i < end被评估并且其结果被丢弃。
因此,循环由表达式的值控制,该表达式printf("at condition i=%d\n",i)返回它打印的字符数,因此它总是像true这里一样评估并导致无限循环。

于 2014-06-26T12:11:36.053 回答
1

因为

1)i < end, printf("at condition i=%d\n",i)返回与 相同的值printf("at condition i=%d\n",i)

2)printf()返回打印字符的数量(在这种情况下不为零)

因此,循环中的条件始终为真。

于 2014-06-26T12:12:18.803 回答
0

在 expressioni < end, printf("at condition i=%d\n")中,逗号操作符导致两个表达式按顺序进行求值,但第一个表达式的结果被丢弃,只使用 of 的结果printf来控制循环。由于printf该格式字符串将始终返回非零值,因此循环永远不会终止。

改用&&

for (int i = 0; i < end && printf("at condition i=%d\n"); i++)
于 2014-06-26T12:19:40.227 回答