#include <stdio.h> int main() { int a = 1; int b = 0; // Following two statements returns the same output printf("\nhah %d", a != 0 & b != 0); // returns 1 printf("\nhah %d", a != 0 && b != 0); // returns 1 // Despite the common misconception that the statement 1 when written explicitly // is this... printf("\nmeh %d", (a != (0 & b)) != 0); // returns 0 // ..., statement 1's AND(&) operator still retain the same operator precedence as its short-circuit cousin(&&) printf("\n"); const int ALT_KEY = 2; int input = 1; // should return 0, it returns 0: printf("\nhah %d", (input & ALT_KEY) == ALT_KEY); // despite the expectation that this "should" return 0, this doesn't return 0: printf("\nmeh %d", input & ALT_KEY == ALT_KEY); // So it means, despite the introduction of short-circuit operator, // the non-short-circuit logical/bitwise operator (&,|) still retain their // operator precedence. // Hence, the unparenthesized expression (input & ALT_KEY == ALT_KEY), when written explicitly is still evaluated as: printf("\nhah %d", input & (ALT_KEY == ALT_KEY) ); // returns 1 // Similar with operator precedence of logical operator: printf("\nhah %d", input && ALT_KEY == ALT_KEY ); // returns 1 // Logical operator when written explicitly printf("\nhah %d", input && (ALT_KEY == ALT_KEY) ); // returns 1 printf("\n"); }
You might notice that I mentioned the phrase still retain two times. There was a time that there was no short-circuit operators, && and ||. Programmers uses & and | for logical expression. Despite the introduction of their short-circuit equivalent, the non-short-circuit logical/bitwise operator precedence was not changed, the non-short-circuit operators' precedence are still equivalent with the short-circuit ones.
Long before, when I'm making a DOS(hahah showing my age) program to detect a hotkey, I tried it this way first:
if (input & ALT_KEY == ALT_KEY) { printf("You pressed the shortcut combo!"); }
Expecting it to evaluate the same with arithmetic operator precedence:
if (a + b == C) { printf("True true"); }
But alas, C is not free with old cruft, it still has B-ness in it. So you must write it this way:
if ( (input & ALT_KEY) == ALT_KEY ) { printf("You pressed the shortcut combo!"); }
If the unparenthesized expression(input & ALT_KEY == ALT_KEY) is written explicitly, it is this:
if ( input & (ALT_KEY == ALT_KEY) ) { printf("You pressed the shortcut combo!"); }
Disappointing isn't it? Not symmetrical with arithmetic operator precedence.
Backward compatibility at its finest: http://cm.bell-labs.com/cm/cs/who/dmr/chist.html
Output:
hah 0 hah 0 meh 1 hah 0 meh 1 hah 1 hah 1 hah 1
See the live example: http://ideone.com/allR6
No comments:
Post a Comment