例如,对于这样的陈述:
c += 2, c -= 1
Run Code Online (Sandbox Code Playgroud)
是否真的首先总是评估c + = 2,而第二个表达式c- = 1中的c将始终是表达式c + = 2的更新值?
是的,它由标准保证,只要该逗号是非重载的逗号运算符.引用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)在评估正确表达之前进行.结果的类型和值是右操作数的类型和值; 如果右操作数为,则结果为左值.
但限制是相同的:不适用于重载的逗号运算符或函数参数列表.
| 归档时间: |
|
| 查看次数: |
787 次 |
| 最近记录: |