Darien Pardinas
Darien Pardinas

Reputation: 6186

Precedence of operators

Look at this simple class:

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

Why, when I run the following code, does it print 21?

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

But if I run it like this it prints 12 which is what I was expecting:

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

What am I missing here? Operator precedence? FYI, this is a C++ test problem, not a production code.

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

Upvotes: 3

Views: 172

Answers (2)

AnT stands with Russia
AnT stands with Russia

Reputation: 320381

Operator precedence does not dictate the order of evaluation of intermediate results. I.e. it does not dictate the order of evaluation of sub-expressions in the entire expression.

Expression statement

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

can be executed by the compiler as

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

or as

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

In this case operator precedence and associativity for operator << guarantees that tmp_a is sent to output before tmp_b. But it does not guarantee that tmp_a is evaluated before tmp_b.

Upvotes: 8

Drew Dormann
Drew Dormann

Reputation: 63735

This line:

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

does not specify whether a.get() or b.get() is evaluated first.

Since a and b share the same val pointer, the order of those operations affect the output.

(Edit)

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

That is also not specified.

Upvotes: 2

Related Questions