Search code examples
coperator-precedenceshort-circuiting

Short circuit evaluation of a statement with ++ operator in C


I have executed the following code in Code::Blocks 10.05 on Windows 7.

int a=0,b=0,c;
c=a++&&b++;
printf("\na=%d\nb=%d\nc=%d\n\n",a,b,c);

The output I obtained is given below,

a=1
b=0
c=0

This makes perfect sense because of short circuit evaluation.

The expression a++ is post increment and 0 is returned to the logical and (&&). Hence the part b++ is not evaluated since both 0 && 0 and 0 && 1 evaluates to 0.

But here arises my doubt. The precedence value of operators clearly states that ++ is having higher precedence over &&. So my understanding was like this, both a++ and b++ are evaluated and then && only checks the result of expression a++ to come to a decision. But this has not happened only a++ is evaluated here.

What is the reason for this behavior? Does && being a sequence point has something to do with this behavior? If so why we say that && is having lower precedence than ++?


Solution

  • You are confused about precedence and order of evaluation.

    Precedence defines how the operators are grouped, i.e

    c = a++ && b++;
    

    is equivalent to:

    c = ((a++) && (b++));
    

    Order of evaluation defines how the expression is evaluated, the short circuit of && means a++ is evaluated first, if it's zero, the end; if it's not zero, b++ is then evaluated.


    As another example:

    c = (a++) + (b++);
    

    Is a++ evaluated before b++? The answer is we don't know. Most operators don't define the order of evaluation. && is one of the few operators that do define. (The rest are ||, , and ?:)