括号中的求值顺序和C ++中逗号表达式的类型(x0 = y0,x1 = y1,x2 = x0,...)

时间:2018-02-21 21:44:39

标签: c++ c++11 constexpr operator-precedence comma-operator

C++中,可以执行以下操作:

int f(int& a, int& b, int& c, int& d) { 
    return (a, b, c, d); // here
}

首先,语言中的名称(和cppreference上的链接)到这个"括号"表达式,只返回最后一个术语;

其次,让我们说代码变成:

int f(int& a, int& b, int& c, int& d) { 
    return (a += 2, d += 5, b -= 3, c = a + b + d, d); // here
}

这些评论的顺序是"括号"表情固定?如果有,我保证f将从左到右更改abcd的值,并返回d的正确更新值,如果是:

int f(int& a, int& b, int& c, int& d) { 
    a += 2;
    d += 5;
    b -= 3;
    c = a + b + d;
    return d;
}

最后,纯粹在C++11中(因为问题不再存在于C++14中,因为constexpr没有这么强的要求),这可以用括号表示用于在单个constexpr函数中编写多个计算?

1 个答案:

答案 0 :(得分:3)

  

首先,语言中的名称(和cppreference上的链接)到这个"括号"表达式,只返回最后一个术语;

"comma operator"

我的意思是:逗号运算符评估但是丢弃左边的元素并返回右边的元素(如果左边的元素不是重新定义了逗号运算符的对象)。

并且不需要括号;你也可以写。

return a, b, c, d;
  

其次,让我们说代码变成了[...]这些是评论的顺序"括号"表达式已修复?

是;从左到右。

寻找"序列点"了解更多信息。

来自

return a += 2, d += 5, b -= 3, c = a + b + d, d;

你得到与

完全相同的结果
a += 2; d += 5; b -= 3; c = a + b + d; return d;

同时计算adbcintint不是' ta重新定义逗号运算符的类。

但是不要混淆逗号运算符"中的逗号。用逗号分隔函数调用中的参数。第一个是"序列点",第二个是#t;

我的意思是:用

int i = 0;

return  i++, i++, i++;

定义返回值(2);如果foo()是一个接收三个整数的函数,那么

int i = 0;

foo(i++, i++, i++);

您知道foo()收到零,一个和两个但订单未指定(第一个参数可以是0而第三个参数可以是2或相反)

  

最后,纯粹在C ++ 11中,这个括号表达式可以用来在一个constexpr函数中写几个计算吗?

而且(恕我直言)这是一个非常有用的功能。