逗号操作员是否没有副作用?

scd*_*dmb 6 c++ expression

例如,对于这样的陈述:

c += 2, c -= 1
Run Code Online (Sandbox Code Playgroud)

是否真的首先总是评估c + = 2,而第二个表达式c- = 1中的c将始终是表达式c + = 2的更新值?

Mat*_*Mat 9

是的,它由标准保证,只要该逗号是非重载的逗号运算符.引用n3290§5.18:

逗号运算符从左到右分组.

表达式:
assignment-expression
表达式,赋值表达式

用逗号分隔的一对表达式从左到右进行评估; 左表达式是丢弃值表达式(第5条)83.与右表达式相关联的每个值计算和副作用之前,对与左表达式相关联的每个值计算和副作用 进行排序.结果的类型和值是右操作数的类型和值; 结果与右操作数具有相同的值类别,如果右操作数是glvalue和位域,则是一个位域.

以及相应的脚注:

83然而,一个重载逗号操作的调用是一个普通的函数调用; 因此,对其论证表达式的评价相对于彼此没有排序(见1.9).

所以这个成立用于非重载逗号操作.

,参数的函数之间没有逗号运营商.此规则也不适用于此.

对于C++ 03,情况类似:

逗号运算符从左到右分组.

表达式:
assignment-expression
表达式,赋值表达式

由逗号分隔的一对表达式从左到右计算,并且左表达式的值被丢弃.左值表示左值 - 右值(4.1),数组到指针(4.2)和函数到指针(4.3)标准转换.除了对临时表的破坏(12.2)之外,左表达的所有副作用(1.9)在评估正确表达之前进行.结果的类型和值是右操作数的类型和值; 如果右操作数为,则结果为左值.

但限制是相同的:不适用于重载的逗号运算符或函数参数列表.

  • 我认为这里可能有一个微妙的"陷阱"取决于`c`的类型.如果它有`operator,`重载,那么我认为它不是一个序列点,因此可能导致未定义的行为. (3认同)

Bla*_*iev 7

是的,逗号运算符保证语句按从左到右的顺序进行计算,返回的值是最右侧的计算语句.

但请注意,某些上下文中的逗号不是逗号运算符.例如,函数参数列表不保证以上内容.