[H-GEN] & and && in C and BCPL
Martin Pool
martinp at mincom.com
Thu Oct 21 00:12:16 EDT 1999
[ Humbug *General* list - semi-serious discussions about Humbug and
Unix-related topics. ]
In <http://www.perl.com/tchrist/defop/defconfaq.html>
Rapid changes continued after the language had been named, for
example the introduction of the && and || operators. In BCPL and
B, the evaluation of expressions depends on context: within if
and other conditional statements that compare an expression's
value with zero, these languages place a special interpretation
on the and (&) and or (|) operators. In ordinary contexts, they
operate bitwise, but in the B statement
if (e1 & e2) ...
the compiler must evaluate e1 and if it is non-zero, evaluate e2,
and if it too is non-zero, elaborate the statement dependent on
the if. The requirement descends recursively on & and | operators
within e1 and e2. The short-circuit semantics of the Boolean
operators in such `truth-value' context seemed desirable, but the
overloading of the operators was difficult to explain and use. At
the suggestion of Alan Snyder, I introduced the && and ||
operators to make the mechanism more explicit.
Their tardy introduction explains an infelicity of C's precedence
rules. In B one writes
if (a==b & c) ...
to check whether a equals b and c is non-zero; in such a
conditional expression it is better that & have lower precedence
than ==. In converting from B to C, one wants to replace & by &&
in such a statement; to make the conversion less painful, we
decided to keep the precedence of the & operator the same
relative to ==, and merely split the precedence of && slightly
from &. Today, it seems that it would have been preferable to
move the relative precedences of & and ==, and thereby simplify a
common C idiom: to test a masked value against another value, one
must write
if ((a&mask) == b) ...
where the inner parentheses are required but easily forgotten.
--
Martin
(Restoring the seriousity of h-general!)
--
This is list (humbug) general handled by majordomo at lists.humbug.org.au .
Postings only from subscribed addresses of lists general or general-post.
More information about the General
mailing list