Article ID: 37624
Article Last Modified on 12/12/2003
APPLIES TO
- Microsoft Visual C++ 1.0 Professional Edition
- Microsoft Visual C++ 1.5 Professional Edition
- Microsoft Visual C++ 1.51
- Microsoft Visual C++ 1.52 Professional Edition
- Microsoft Visual C++ 2.0 Professional Edition
- Microsoft Visual C++ 2.1
- Microsoft Visual C++ 4.0 Standard Edition
- Microsoft Visual C++ 5.0 Enterprise Edition
- Microsoft Visual C++ 6.0 Enterprise Edition
- Microsoft Visual C++ 5.0 Professional Edition
- Microsoft Visual C++ 6.0 Professional Edition
- Microsoft Visual C++ 6.0 Standard Edition
This article was previously published under Q37624
SUMMARY
Operator precedence in C affects how operands are grouped; it does not necessarily indicate the order in which operands are evaluated. The logical AND (&&) operator has a higher precedence than the logical OR (||) operator. Therefore, the statement:
lvalue = operand1 || operand2 && operand3;
is logically equivalent to the following:
lvalue = operand1 || (operand2 && operand3);
However, this grouping does not indicate that the subexpression (operand2 && operand3) will be evaluated first. In fact, this statement is a logical OR expression with two operands: operand1 and "(operand2 && operand3)." Because a logical OR expression evaluates its operands in left-to-right order, operand1 is evaluated first.
MORE INFORMATION
The following example demonstrates this behavior:
Sample Code:
/* * Compile options needed: none */ #include <stdio.h> int a, b, c, d; void main() { a = (b = 2) || (c = 3) && (d = 4); printf("a = %d, b = %d, c = %d, d = %d\n", a, b, c, d); }
Program output:
a = 1, b = 2, c = 0, d = 0
Because "(b = 2)" is not 0, the result of the expression is TRUE (1) and the code does not perform any further evaluations. Therefore, the code does not perform the assignments to c and d. To ensure that values are always assigned to the variables, use separate assignment statements.
As Kernighan and Ritchie note on page 54 of "The C Programming Language" (second edition), "The moral is that writing code that depends on the order of evaluation is a bad programming practice in any language."
Keywords: kbinfo kblangc KB37624