INFO: Precedence Affects Grouping of Operands, Not Evaluation (37624)



The information in this article applies to:

  • Microsoft Visual C++ 1.0
  • Microsoft Visual C++ 1.5
  • Microsoft Visual C++ 1.51
  • Microsoft Visual C++ 1.52
  • Microsoft Visual C++ 2.0
  • Microsoft Visual C++ 2.1
  • Microsoft Visual C++ 4.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 5.0
  • Microsoft Visual C++, 32-bit Enterprise Edition 6.0
  • Microsoft Visual C++, 32-bit Professional Edition 5.0
  • Microsoft Visual C++, 32-bit Professional Edition 6.0
  • Microsoft Visual C++, 32-bit Learning Edition 6.0

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

Modification Type:MajorLast Reviewed:12/12/2003
Keywords:kbinfo kbLangC KB37624