&
has &&
. |
has ||
. Why doesn't ^
have ^^
?
I understand that it wouldn't be short-circuiting, but it would have different semantics. In C, true
is really any non-zero value. Bitwise XOR is not always the same thing as logical XOR:
int a=strcmp(str1,str2);// evaluates to 1, which is "true"
int b=strcmp(str1,str3);// evaluates to 2, which is also "true"
int c=a ^^ b; // this would be false, since true ^ true = false
int d=a ^ b; //oops, this is true again, it is 3 (^ is bitwise)
Since you can't always rely on a true value being 1
or -1
, wouldn't a ^^
operator be very helpful? I often have to do strange things like this:
if(!!a ^ !!b) // looks strange
There are both historical and practical reasons why there is no
^^
operator.The practical is: there's not much use for the operator. The main point of
&&
and||
is to take advantage of their short-circuit evaluation not only for efficiency reasons, but more often for expressiveness and correctness.
[...]
By contrast, an^^
operator would always force evaluation of both arms of the expression, so there's no efficiency gain. Furthermore, situations in which^^
is really called for are pretty rare, though examples can be created. These situations get rarer and stranger as you stack up the operator--if (cond1() ^^ cond2() ^^ cond3() ^^ ...) ...
does the consequent exactly when an odd number of the
condx()
s are true. By contrast, the&&
and||
analogs remain fairly plausible and useful.