Microsoft KB Archive/37624

= INFO: Precedence Affects Grouping of Operands, Not Evaluation =

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 &quot;(operand2 && operand3).&quot; 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 */


 * 1) include 

int a, b, c, d;

void main {  a = (b = 2) || (c = 3) && (d = 4); printf(&quot;a = %d, b = %d, c = %d, d = %d\n&quot;, a, b, c, d); } Program output:   a = 1, b = 2, c = 0, d = 0 Because &quot;(b = 2)&quot; 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 &quot;The C Programming Language&quot; (second edition), &quot;The moral is that writing code that depends on the order of evaluation is a bad programming practice in any language.&quot;

Keywords: kbinfo kblangc KB37624

-

[mailto:TECHNET@MICROSOFT.COM Send feedback to Microsoft]

© Microsoft Corporation. All rights reserved.