conditional expression evaluati

stephen at datacube.UUCP stephen at datacube.UUCP
Tue Jan 20 02:29:00 AEST 1987


> My small contribution to this silly topic:
> 
>     x = (*cp++ | *cp++ | *cp++);                                (1)
>     if (x) ... /* or !x or whatever */
> 
> In computing the value to be assigned to the variable `x', the compiler
> cannot short-circuit the expression.  This should be clear; in the
> simpler case
> 
>     x = (a | b | c);
> 
> if the variable `a' contains zero, the compiler must still OR the
> contents of `b' and `c' to determine the result.  These are bitwise
> logical operators.  Short-circuiting these makes no more sense than
> short-circuiting a sequence of multiplies as soon as one of the
> operands evaluates to `1'.
> 
> I of course agree that a potential problem exists with (1) above.  If
> the evaluation of `*cp++' is not atomic, and the increment could be
> delayed, the result may be equal to the first byte of the series.  In
> any case, `cp' must be incremented by `3' and both bitwise-OR operations
> must be performed.  Oh well, I guess an optimizing compiler that 
> delays the increments might realize this and skip the OR's...this
> is getting ridiculous.
> 
> --
> ****                                                         ****
> **** At Digital Lynx, we're almost in Garland, but not quite ****
> ****                                                         ****
> 
> Mike McNally                                    Digital Lynx Inc.
> Software (not hardware) Person                  Dallas  TX  75243
> uucp: {texsun,killer,infotel}!pollux!bobkat!m5  (214) 238-7474

This posting indicates a misunderstanding of how short-circuit evaluation
works. In the case of the '|' expression above, the decision to not evaluate
is would occur when a or b are all ones, NOT when a or b was zero. In the
case of the multiply, a or b == 0 would be used as the criterion. So the
question is not whether such expressions are capable of being short-circuited,
but whether they are. (Of course they are not.) Because logical boolean
operations are short-circuited, and binary boolean operations are not, an
expression like:

	if( cp[0] == '\0' && cp[1] == '\0' && cp[2] == '\0' ){
	    ...
	}

may be more efficient than:

	if( (*cp++ | *cp++ | *cp++) == 0){
	    ...
	}

and moreover, is guaranteed to work in any properly functioning C compiler
on any computer in the universe.


Stephen Watkins                    UUCP: ihnp4!datacube!stephen
Datacube Inc.; 4 Dearborn Rd.; Peabody, Ma. 01960; 617-535-6644



More information about the Comp.lang.c mailing list