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 ++
?
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 ?:
)
There are two concepts here - order of precedence and order of evaluation. Order of precedence will have an impact only if an expression (or sub-expression) is evaluated.
In general, the order of evaluation is not sequenced. Given an operator, its operands can be evaluated in any order. The arguments of a function can be evaluated in any order.
From the C++ Standard:
1.9 Program execution
15 Except where noted, evaluations of operands of individual operators and of subexpressions of individual expressions are unsequenced.
and
8.3.6 Default arguments
9 Default arguments are evaluated each time the function is called. The order of evaluation of function arguments is unspecified.
For the logical AND operator, &&
, the C++11 standard says:
5.14 Logical AND operator
1 The
&&
operator groups left-to-right. The operands are both contextually converted to typebool
(Clause 4). The result istrue
if both operands aretrue
andfalse
otherwise. Unlike&
,&&
guarantees left-to-right evaluation: the second operand is not evaluated if the first operand isfalse
.
Similar exception is specified for the logical OR operator, ||
.
Since b++
is not evaluated due to short circuiting of the expression because of &&
operator, the order of precedence of the operators has no significance in this particular case.
来源:https://stackoverflow.com/questions/31779410/short-circuit-evaluation-of-a-statement-with-operator-in-c