The nonexistent operator (along = v. == lines)
Darren Morbey
darren at revcan.UUCP
Tue Apr 2 23:59:47 AEST 1991
I've noticed in my writing C code that there is no such operator
as ^^ (which would be to ^ as || is to |). I feel in this case
I *have* to write a macro for this *nonexistent* operator (you may
recall I wrote #define XOR(a,b) ((a)^(b)) ). However...
The Pascal xor operator is <>, which follows since it has a Boolean
type on which its and & or operators can (and only will) operate.
Since C uses any non-zero value as 'true', it seems the only reason
to include && and || to avoid trouble with & and |. The problem is,
there is no ^^ to avoid trouble with ^.
I would like to use one of the following three macros, but each has
its own particular problems. I would appreciate any advice on which
one should be used. I would like it to operate like && and ||.
1. #define XOR(a,b) ( ( !(a) && (b) ) || ( (a) && !(b) ) )
- Althought this is straight from the definition of XOR
( as (NOT A AND B) OR (A AND NOT B) ) it must evaluate
a and b *twice* (obvious loss of flexibility)
2. #define XOR(a,b) ( !(a) != !(b) )
- This is meant to overcome C's acceptance of multiple TRUEs
( unlike Pascal's single TRUE value ). This relies on the
following statements being true:
( 0 == 0L ) (since a and b may yield different sized int's)
( !0 == !(0L) )
( !(0L) == !('\0') ) (which may happen!)
etc. Can such expressions be *guaranteed* true?
3. #define XOR(a,b) ( (a) ? !(b) : (b) ) /* my favourite. */
- This relies simply on one thing: in the conditional expression,
do *both* !(b) and (b) get evaluated, regardless of which is
returned? Or is only the value to be returned evaluated.
(Final note: This *is* meant to be *portable*. Be very careful.)
[ Darren Morby +1 613 957 9281 {uunet|lsuc|fts1}!revcan!darren ]
[ Revenue Canada Taxation, 3052-400 Cumberland St, Ottawa,ONT K1A 0L8 ]
(included for those who wish to send mail, call me, or send any lynch)
(mobs you can hire. :-) )
More information about the Comp.lang.c
mailing list