INFO: Precedence Affects Grouping of Operands, Not EvaluationLast reviewed: August 26, 1997Article ID: Q37624 |
The information in this article applies to:
SUMMARYOperator 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 INFORMATIONThe 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 = 0Because "(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 : CLngIss kbfasttip Version : MS-DOS:5.1,6.0,6.00a,6.00ax,7.0; WINDOWS:1.0,1.5,1.51,1.52; WINDOWS NT:1.0,2.0,2.1,4.0,5.0 Platform : MS-DOS NT WINDOWS Issue type : kbinfo |
================================================================================
© 1998 Microsoft Corporation. All rights reserved. Terms of Use. |