c - 逗号分隔的表达式作为 for 循环中的条件如何工作?

标签 c for-loop conditional-statements

我已经在 Stack Overflow 上的答案和问题中看到过几次,这是一个以逗号分隔的列表作为 for 循环的循环条件,例如:for(int i = 0, int j = 0 ; i < 2, j < 4; i++, j++) { ... } .这是如何工作的?

逗号分隔的条件如何在 C 中的 for 循环中工作? 喜欢: for(int i = 0, int j = 1 ; i < 5, j < 4; i++, j++) { ... }

这不是因为条件需要是一个评估表达式而无效吗?多个逗号分隔的表达式如何在 for 循环中计算为一个表达式?

上述表达式用分号括起来; i < 5, j < 4; ,这应该是循环的条件。还是我错了?

最佳答案

for 的语法带有声明的循环是 (6.8.5):

for ( declaration expression_opt ; expression_opt ) statement

这个

for(int i = 0, int j = 1 ; i < 5, j < 4; i++, j++) { }

不解析是因为

int i = 0, int j = 1 ;作为声明(或 C 中的任何句子形式)在语法上无效,但

for(int i = 0, j = 1; i < 5, j < 4; i++, j++) { }

会解析,因为

int i = 0, j = 1;

是一个有效的声明(具有多个包含初始化器的声明器)并且

i < 5, j < 4

是一个有效的包含逗号运算符的表达式,原样

i++, j++

.

(请注意 i < 5, j < 4j < 4 具有相同的效果,因为逗号表达式是从左到右计算的,并且使用最后一部分的值,并且由于 i < 5 在这里没有副作用,所以整个表达式仅相当于 j < 4 。您可能想要 i < 5 && j < 4。)

for 的原始形式循环(没有声明)你有(6.8.5)

 for ( expression_opt ; expression_opt ; expression_opt ) statement

分号用于分隔 3 个(可选)表达式。

在包含声明的表单中,第一个分号被解析为声明的一部分

for ( declaration expression_opt ; expression_opt ) statement

关于c - 逗号分隔的表达式作为 for 循环中的条件如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59611230/

相关文章:

c++ - 为什么 Visual C++ 自动矢量化器不矢量化这个简单的循环?

c - 如果 pthread 条件变量收到信号但互斥体被锁定,会发生什么情况?

c - "Hello World"会打印多少次?

javascript - jQuery For Loop 图像检查和显示

r - 如何在 R 中的特定条件下删除行?

mysql - 如果不满足条件,则替换满足条件的行中的值

C 程序能否根据其值确定宏标识符/枚举名称?

无法理解代码片段

javascript - Hogan JS 模板中的 For 循环

python - 在 python 三元中使用 continue?