逗号运算符 ,
逗号表达式 包含两个以逗号分隔的任意类型的操作数,并且具有从左到右的关联性。 将对左操作数进行完全求值,这可能产生副作用,并且将废弃其值 (如果有)。 然后对右操作数进行求值。 逗号表达式的结果的类型和值是其在通常一元转换之后的右操作数的类型和值。
逗号表达式的结果不是左值。 
在C++中,如果右操作数是左值,则结果为左值。 下列语句是等价的:r = (a,b,...,c);
a; b; r = c; 不同的是,逗号运算符可能适用于表达式上下文,例如循环控制表达式。类似地,如果右操作数是 lvalue ,那么可以采用复合表达式的地址。
&(a, b)
a, &b
以逗号分隔的任何数目的表达式都可以构成单个表达式,因为逗号运算符是关联的。 使用逗号运算符保证子表达式将按从左到右的顺序进行求值,最后一个表达式的值将成为整个表达式的值。 在以下示例中,如果
omega 具有值 11,那么表达式将递增 delta ,并将值 3 分配给 alpha:alpha = (delta++, omega % 4);在第一个操作数的求值之后出现一个序列点。 将废弃 delta 的值。 同样,在以下示例中,表达式的值:intensity++, shade * increment, rotate(direction);是表达式的值:rotate(direction)在使用逗号字符的某些上下文中,需要使用括号来避免岐义。 例如,函数
f(a, (t = 3, t + 2), c);只有三个参数: a的值, 5的值和 c的值。 其他需要括号的上下文包括结构和并集声明器列表中的字段长度表达式,枚举声明器列表中的枚举值表达式以及声明和初始化程序中的初始化表达式。在上一个示例中,逗号用于分隔函数调用中的自变量表达式。 在此上下文中,它的使用不保证函数自变量的求值顺序 (从左到右)。
逗号运算符的主要用途是在以下情况下产生副作用:
- 调用函数
- 进入或重复迭代循环
- 测试条件
- 其他需要副作用但不立即需要表达式结果的情况
下表提供了一些使用逗号运算符的示例。
| 语句 | 效果 |
|---|---|
for (i=0; i<2; ++i, f()
); |
一个 for 语句,其中 i 递增并在每次迭代时调用 f() 。 |
if ( f(), ++i, i>1 )
{ /* ... */ } |
调用函数 f() 的 if 语句,变量 i 递增,变量 i 根据值进行检验。 此逗号表达式中的前两个表达式将在表达式 i>1之前进行求值。 无论前两个表达式的结果如何,都将对第三个表达式进行求值,并且其结果将确定是否处理 if 语句。 |
func( ( ++a, f(a) ) ); |
对 func() 的函数调用,其中 a 递增,生成的值传递到函数 f(), f() 的返回值传递到 func()。 函数 func() 仅传递单个自变量,因为逗号表达式括在函数自变量列表中的括号内。 |