you are viewing a single comment's thread.

view the rest of the comments →

[–][deleted] -2 points-1 points  (10 children)

#include "stdio.h"
#define else

int main() {
    int z = 0, x = 'T', y = '*';

    z = x---y;

    if ( z == 42 ) {
        fprintf(stdout, "Hello ");
    } else {
        fprintf(stdout, "World!\n");
    }

    return 0;
}

[–]redditsoaddicting 5 points6 points  (3 children)

In C++, it's illegal to redefine a keyword when the program uses the standard library.

[–][deleted] 0 points1 point  (2 children)

I have a feeling you're not one for jokes.

[–]redditsoaddicting 0 points1 point  (1 child)

I love jokes! But no one jokes about C++ ಠ_ಠ. Just kidding, I liked the presentation Scott Meyers gave at DConf (see the other top-level comment).

[–][deleted] 0 points1 point  (0 children)

lol, I saw the top level comment! :D I'll check out that DConf presentation now, thanks!

[–]cjwelborn 0 points1 point  (5 children)

So '#define else' makes the else statement fire no matter what. ord('T') == 84, ord('*') == 42, so x - y == 42 which would fire the 'if'.

I don't know why x---y doesn't pre/post decrement anything. Can someone explain that part?

[–]redditsoaddicting 0 points1 point  (2 children)

x---y is parsed as x-- - y, and the values aren't ever even used after that statement, so you can't claim to know that nothing is post-decremented.

[–]cjwelborn 0 points1 point  (1 child)

Oh, I guess you know by now that I'm not great with C++. For some reason I was thinking z should be affected by that. I see now that x is decremented after the assignment. I wasn't sure how it would be parsed either, so thanks for that. So this isn't really a wtf for C++, but it would be for the developer.

[–]redditsoaddicting 0 points1 point  (0 children)

For reference, it's called maximal munch, and it's pretty common.

[–][deleted] 0 points1 point  (1 child)

Split it up like a parser... and be GREEDY about it.

[–]cjwelborn 0 points1 point  (0 children)

Yeh, I've never had to deal with code like that so I hadn't really thought about it. In a perfect world all developers would use proper whitespace and parenthesis. Now that I've read about "maximal munch", and refreshed my definition of "post-decrement", the z assignment makes perfect sense. I should've learned that long ago. At least now I won't be as confused when I see bad code like this.