在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
中(因为constexpr
不再存在问题,因为CC_10没有强大的要求(,可以使用此括号表达式在单个constexpr
函数中写几个计算?
首先,语言中的名称(以及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
s,int
不是重新定义逗号运算符的类。
,但不要将"逗号运算符"中的逗号与逗号混淆,该逗号将函数调用中的参数分开。第一个是"序列",第二个不是。
我的意思是:使用
int i = 0;
return i++, i++, i++;
定义返回的值(2(;如果foo()
是接收三个整数的函数,则使用
int i = 0;
foo(i++, i++, i++);
您知道foo()
接收零,一个和两个,但未指定订单(对于第一个参数,可以是0
,而第三个参数或相反的2
(。
最后,纯粹在C 11 [...]中可以使用此括号表达式在单个constexpr函数中编写几个计算?
是。
和(IMHO(这是一个非常有用的功能。