0

I was learning precedence rule in C++. In which conditional operator is said to have Right to Left associativity. I interpret this as evaluation of expression start from right and proceed to left. So, for the below code-

int a=1, b=2, c;
c=a>b? a=a*2: a=a+3;
cout<<c<<" "<<a;

I assume output as

8 8

But actual output is

4 4

I don't understand how actually this associativity works, because from the above output it seems to me conditional operator have left to right associativity.

melpomene
  • 84,125
  • 8
  • 85
  • 148
T.g
  • 169
  • 2
  • 11

1 Answers1

6

Associativity tells you what happens if you have multiple instances of the same operator in a row. For example,

f() - g() - h()

parses as

(f() - g()) - h()

and not

f() - (g() - h())

because - is left associative, not right associative.

None of this has anything to do with evaluation order, which determines which function is called first.

As for ?: being right associative, it means

a ? b : c ? d : e

parses as

a ? b : (c ? d : e)

(This makes slightly more sense if you think of ?...: as a single operator.)

However, ?: guarantees left-to-right evaluation: The first operand is always evaluated first, then exactly one of the other operands (depending on the truth value of the first result).


In your example,

c=a>b? a=a*2: a=a+3

(please never put assignments inside ?: like that in real code) is parsed as

c = ((a>b) ? (a=a*2) : (a=a+3))

This is entirely due to precedence, not associativity (we don't have multiple identical operators next to each other here).

a>b is evaluated first (yielding false), which causes a=a+3 to be evaluated (yielding 4), which is then assigned to c.

melpomene
  • 84,125
  • 8
  • 85
  • 148
  • That means associativity rule apply only if ( there is another opaertor of same precedence present in expression, ) otherwise not. – T.g May 08 '19 at 16:04