INFO: Precedence Affects Grouping of Operands, Not Evaluation

ID: Q37624


The information in this article applies to:
  • Microsoft C for MS-DOS, versions 5.1, 6.0, 6.0a, 6.0ax
  • Microsoft C/C++ for MS-DOS, version 7.0
  • Microsoft Visual C++ for Windows, 16-bit edition, versions 1.0, 1.5, 1.51, 1.52
  • Microsoft Visual C++, 32-bit Editions, versions 1.0, 2.0, 2.1, 4.0, 5.0, 6.0


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."

Additional query words:

Keywords : kbLangC kbVC100 kbVC150 kbVC151 kbVC152 kbVC200 kbVC210 kbVC400 kbVC500 kbVC600
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


Last Reviewed: July 6, 1999
© 2000 Microsoft Corporation. All rights reserved. Terms of Use.