在以下代码中:
int main() {
int i, j;
j = 10;
i = (j++, j+100, 999+j);
cout << i;
return 0;
}
输出为1010。
然而,它不应该是1009吗?因为++
应该在使用整个表达式之后进行?
逗号运算符是一个序列点:正如它在C++17标准中所说,例如
与左表达式相关的每个值计算和副作用都是按顺序排列的在每次值计算和与正确表达式相关联的副作用之前。
因此,++
运算符的效果保证在评估999+j
之前发生。
++
应该在使用整个表达式后执行吗?
否。后缀运算符计算旧j
的值,并具有递增j
的副作用。
逗号运算符计算第二个操作数,然后计算第一个操作数及其副作用。
用逗号分隔的一对表达式从左到右求值;左边的表达式是一个丢弃值表达式(第5条(83。每个值的计算和与左边相关的副作用在每次值计算和副作用之前,表达式都是按顺序排列的与正确的表达式相关联。
https://stackoverflow.com/a/7784819/2805305
逗号运算符的关联性从左到右。
因此,从j++
开始,这将首先进行评估(j
变为11
(
然后评估j + 100
(不使用(
然后评估等于1010
的999 + j
此最右边的值分配给i
因此,输出为1010
长答案:
内置逗号运算符
逗号运算符表达式的形式为
E1 , E2
在逗号表达式E1、E2中,表达式E1被求值,其结果被丢弃(尽管如果它具有类类型,则不会销毁,直到包含完整表达式结束(,及其副作用在评估表达式E2之前完成开始(注意,用户定义的运算符,不能保证测序((直到C++17(。
这已经回答了您的问题,但我将参考您的代码进行介绍:
从这样简单的东西开始
int value = (1 + 2, 2 + 3, 4 + 5); // value is assigned 9
因为。。。表达式E1被求值,其结果被丢弃这里,由于我们有两个以上的操作数,逗号运算符的结合性也发挥了作用。
然而,它不应该是1009吗,因为"++"应该在整个是否使用表达式?
现在查看:
int j = 0;
int i = (j++, 9 + j);
这里, 。。。并且其副作用在表达式E2的评估开始之前完成我想现在你可以清楚地理解为什么你的i
的值是10,因为j = 10;
i = (j++, j+100, 999+j);
i
的值为1010。