运算符的优先级?

Precedence of operators?

看看这个简单的class:

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) 然后 Expr1Expr2 在打印 Expr1 的输出之前被评估?

这一行:

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

未指定先计算 a.get() 还是 b.get()

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

(编辑)

Does it means that when I have cout << (Expr1) << (Expr2) then Expr1 and Expr2 are evaluated before the output of Expr1 is printed?

那个也没有说明。

运算符优先级不决定中间结果的评估顺序。 IE。它不规定整个表达式中子表达式的求值顺序。

表达式语句

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_atmp_b.

之前被 评估