The relational and equality operators are left-associative in C. Consequently, C, unlike many other languages, allows chaining of relational and equality operators. C99The C standard, Section 6.5.8 "Relational operators", paragraph 6 has a footnote (92), which says, footnote 107 [ISO/IEC 9899:2011], says:
The expression
a<b<c
is not interpreted as in ordinary mathematics. As the syntax indicates, it means(a<b)<c
; in other words, "ifa
is less thanb
, compare 1 toc
; otherwise, compare 0 toc
.".
These operators are left-associative, which means the leftmost comparison is performed first, and the result is compared with the rightmost comparison. This allows a programmer to write an expression (particularly an expression used as a condition) that can be easily misinterpreted.
Noncompliant Code Example
While Although this noncompliant code example compiles correctly, it is unlikely that it means what the author of the code intended.
Code Block | ||||
---|---|---|---|---|
| ||||
int a = 2;
int b = 2;
int c = 2;
/* ... */
if (a < b < c) /* misleading, likely bug */
/* ... */
if (a == b == c) /* misleading, likely bug */
|
The expression a < b < c
evaluates to true , rather than false, as its author probably intended, and the expression a == b == c
evaluates to false , rather than true, as its author probably intended.
...
Code Block | ||||
---|---|---|---|---|
| ||||
if ( (a < b) && (b < c) ) /* clearer, and probably what was intended */
/* ... */
if ( (a == b) && (a == c) ) /* ditto */
|
...
Tool | Version | Checker | Description | section||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
GCC |
|
| Section | Option | |||||||
| exprprns section | Fully Implementedimplemented. |
Related Guidelines
CERT C++ Secure Coding Standard: EXP17-CPP. Treat relational and equality operators as if they were nonassociative
ISO/IEC 9899:19992011 Section 6.5.8 "Relational operators"
...