[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