类型(x0 = y0,x1 = y1,x2 = x0,..)的括号和逗号表达中的评估顺序



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中(因为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;

还算是adbcint 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(这是一个非常有用的功能。

相关内容

  • 没有找到相关文章

最新更新