运算符的优先级

Precedence of operators?

本文关键字:优先级 运算符      更新时间:2023-10-16

看看这个简单的类:

class A {
    int *val;
public:
    A() { val = new int; *val = 0; }
    int get() { return ++(*val); }
};

为什么当我运行此代码时它会打印21

int main() {
    A a, b = a;
    cout << a.get() << b.get();
    return 0;
}

但是如果我像这样运行它,它会打印12这就是我所期望的:

int main() {
    A a, b = a;
    cout << a.get();
    cout << b.get();
    return 0;
}

我在这里错过了什么?运算符优先级?仅供参考,这是一个C++测试问题,而不是生产代码。

编辑:这是否意味着当我有cout << (Expr1) << (Expr2)时,在打印Expr1的输出之前会评估Expr1Expr2

运算符优先级并不指示中间结果的计算顺序。 也就是说,它不规定整个表达式中子表达式的计算顺序。

表达式语句

cout << a.get() << b.get();

可由编译器执行为

int tmp_a = a.get();
int tmp_b = b.get();
cout << tmp_a;
cout << tmp_b;

或作为

int tmp_b = b.get();
int tmp_a = a.get();
cout << tmp_a;
cout << tmp_b;

在这种情况下,运算符优先级和运算符<<的关联性保证tmp_atmp_b之前发送到输出。但它不能保证在tmp_b之前评估tmp_a

这一行:

cout << a.get() << b.get();

不指定是先评估a.get()还是先评估b.get()

由于 ab共享相同的val指针,因此这些操作的顺序会影响输出。

(编辑)

这是否意味着当我有 cout <<(Expr1) <<(Expr2) 时,在打印 Expr1

的输出之前评估 Expr1 和 Expr2?

也没有具体说明。