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

Rob*_*rtS 3 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++) { ... }

Isn't这个无效的,因为条件的需求是一个评估的表达?如何将多个逗号分隔的表达式计算为 for 循环中的一个表达式?

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

PSk*_*cik 8

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

for ( declaration expression_opt ; expression_opt ) statement
Run Code Online (Sandbox Code Playgroud)

这个

for(int i = 0, int j = 1 ; i < 5, j < 4; i++, j++) { }
Run Code Online (Sandbox Code Playgroud)

不解析因为

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

for(int i = 0, j = 1; i < 5, j < 4; i++, j++) { }
Run Code Online (Sandbox Code Playgroud)

会解析,因为

int i = 0, j = 1;
Run Code Online (Sandbox Code Playgroud)

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

i < 5, j < 4
Run Code Online (Sandbox Code Playgroud)

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

i++, j++
Run Code Online (Sandbox Code Playgroud)

.

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

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

 for ( expression_opt ; expression_opt ; expression_opt ) statement
Run Code Online (Sandbox Code Playgroud)

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

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

for ( declaration expression_opt ; expression_opt ) statement
Run Code Online (Sandbox Code Playgroud)

.