在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
将从左到右更改a
,b
,c
和d
的值,并返回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
函数中编写多个计算?
答案 0 :(得分:3)
首先,语言中的名称(和cppreference上的链接)到这个"括号"表达式,只返回最后一个术语;
我的意思是:逗号运算符评估但是丢弃左边的元素并返回右边的元素(如果左边的元素不是重新定义了逗号运算符的对象)。
并且不需要括号;你也可以写。
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;
同时计算a
,d
,b
和c
为int
且int
不是' ta重新定义逗号运算符的类。
但是不要混淆逗号运算符"中的逗号。用逗号分隔函数调用中的参数。第一个是"序列点",第二个是#t;
我的意思是:用
int i = 0;
return i++, i++, i++;
定义返回值(2);如果foo()
是一个接收三个整数的函数,那么
int i = 0;
foo(i++, i++, i++);
您知道foo()
收到零,一个和两个但订单未指定(第一个参数可以是0
而第三个参数可以是2
或相反)
最后,纯粹在C ++ 11中,这个括号表达式可以用来在一个constexpr函数中写几个计算吗?
是
而且(恕我直言)这是一个非常有用的功能。