gpt4 book ai didi

c++ - 重载运算符的评估顺序 |?

转载 作者:太空狗 更新时间:2023-10-29 23:54:15 26 4
gpt4 key购买 nike

标准中的 5.15 逻辑或运算符说明如下:

Unlike |, || guarantees left-to-right evaluation;

这是否意味着我在标准中找不到某个地方,| 被定义为从右到左求值,或者它是实现定义的?当运算符(operator)重载时,这会有所不同吗?我编写了一个快速程序来对此进行测试,MSVC++ 和 GCC 似乎都评估从右到左

#include<iostream>
using namespace std;

int foo = 7;

class Bar {
public:
Bar& operator|(Bar& other) {
return *this;
}
Bar& operator++() {
foo += 2;
return *this;
}
Bar& operator--() {
foo *= 2;
return *this;
}
};

int main(int argc, char** argv) {
Bar a;
Bar b;
Bar c = ++a | --b;
cout << foo;
}

这会输出 16。如果 ++a--b 被切换,它输出 19

我还考虑过我可能会遇到序列点规则之间的多个更改(以及因此未定义的行为),但我不确定这如何/是否适用于两个单独的实例作为操作数。

最佳答案

暂时忽略那个运算符,只记下这个:

(x + y) * (z + 1)

这里,必须先计算两个操作数才能进行乘法运算(否则我们不知道要乘什么)。在 C++ 中,完成此操作的顺序是未指定:它可能是 (x + y) 首先,或者 (z + 1)首先,编译器觉得哪个更好。†

运算符|也是如此。但是,运算符 || 必须短路,并且为了做到这一点,它必须严格从左到右求值。 (如果左边的计算结果为 true,则计算结束而不计算右边的操作数。)这就是句子的意思。

†请注意,它可能没有任何偏好,只是按照列出的顺序进行评估。这就是为什么你能得到你所做的输出,尽管你不能在语言级别依赖它。

关于c++ - 重载运算符的评估顺序 |?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7185732/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com