Microsoft KB Archive/37624

From BetaArchive Wiki
Knowledge Base


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