Order of evaluation (was Re^2: Turbo C 2.0 vs MSC 5.1)

der Mouse mouse at mcgill-vision.UUCP
Sun Aug 20 20:52:19 AEST 1989


In article <1989Aug9.094742.20000 at gdt.bath.ac.uk>, exspes at gdr.bath.ac.uk (P E Smee) writes:

> (Although, being paranoid, I'd also suggest that the person writing
> a/b/c/d/e should inject lots of ()s to indicate that the ordering is
> really desired.  I tend to parenthesize everything :-)  Goes without
> saying that I strongly feel that languages should honor any
> order-of-evaluation requirements which the programmer specifies using
> parens.

I agree.  The problem is telling order-of-evaluation-requirements
parens from override-operator-precedence parens.  A high percentage
(most?) of the parentheses I use, for example, are either required
syntax (as in a while loop), which don't enter into this discussion, or
needed not because order of evaluation is important but to override
default operator precedence and associativity rules.

Then there are macros.

#define islower(c) (__ctypes[(c)+1]&__CTYPE_LOWER)

#define TABLE_FOR(c) (islower(c)?ltab:utab)

....

a_table = TABLE_FOR('a'+letindex);

(Let's ignore the ASCII-dependent nature of that for the moment.)  I
would be most disappointed in any compiler that failed to
constant-merge the 'a' and the 1 simply because the expanded text,
which would read something like

a_table = ((__ctypes[('a'+letindex)+1]&__CTYPE_LOWER)?ltab:utab);

happens to have a pair of parens which contain the 'a' but not the 1,
thereby prohibiting rearrangement to bring the 'a' and 1 together.

Yet if we omit that pair of parens in the definition of islower, it
then loses big if we write, for example,

islower(usec1?c1:c2)

which would then expand to

(__ctypes[usec1?c1:c2+1]&__CTYPE_LOWER)

...oops.

					der Mouse

			old: mcgill-vision!mouse
			new: mouse at larry.mcrcim.mcgill.edu

(Curious.  Put "islower" next to "isupper" and it reads one way; put it
next to "jslower" and "kslower" and it reads entirely differently. :-)



More information about the Comp.lang.c mailing list