gpt4 book ai didi

c++ - 后递增和预递增运算符的优先级

转载 作者:搜寻专家 更新时间:2023-10-31 01:18:03 25 4
gpt4 key购买 nike

有代码:

#include <iostream>

class Int {
public:
Int() : x(0) {}
Int(int x_) : x(x_) {}
Int& operator=(const Int& b) {
std::cout << "= from " << x << " = " << b.x << std::endl;
x = b.x;
}
Int& operator+=(const Int& b) {
std::cout << "+= from " << x << " + " << b.x << std::endl;
x += b.x;
return *this;
}
Int& operator++() {
std::cout << "++ prefix " << x << std::endl;
++x;
return *this;
}
Int operator++(int) {
std::cout << "++ postfix " << x << std::endl;
Int result(*this);
++x;
return result;
}
private:
int x;

};

Int operator+(const Int& a, const Int& b) {
std::cout << "operator+" << std::endl;
Int result(a);
result += b;
return result;
}

int main() {
Int a(2), b(3), c(4), d;
d = ++a + b++ + ++c;
return 0;
}

结果:

++ prefix 4
++ postfix 3
++ prefix 2
operator+
+= from 3 + 3
operator+
+= from 6 + 5
= from 0 = 11

尽管后缀运算符的优先级高于前缀运算符,但为什么后缀运算符不在前缀运算符(++ 前缀 4)之前执行?

这是由 g++ 编译的。

最佳答案

不同操作数的计算顺序是未指定的,这意味着编译器可以自由地重新排序 ++ab+++ 的计算+c 子表达式。运算符的优先级在该示例中实际上没有任何影响。

如果您尝试编写 ++i++(其中 i 是一个 int),它将被分组为 ++(i++) 并且它将无法编译,因为子表达式 i++ 是一个右值并且前缀增量需要一个左值。如果优先级颠倒,那么该表达式将编译(并导致未定义的行为)

关于c++ - 后递增和预递增运算符的优先级,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7585625/

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