C Trigraph Trap

What will the above C code print?

Let’s take a look:

$ gcc –std=c99 trigraph.c -o test
$ ./test
x = 1

Wait – x was just set to be zero! How can it still be one‽

We get a hint if we don’t specify the language standard:

$ gcc trigraph.c -o test
trigraph.c:7:29: warning: trigraph ??/ ignored, use -trigraphs to enable
$ ./test
x = 0

So it looks like trigraphs have something to do with this weird behaviour. A trigraph is a way to write sequences of characters that represent other characters – usually special characters that were not always on all keyboards. If we take a look at the Wikipedia article under “C”, we see the following translation rule:

??/ → \

… which means that the comment line ends with \ and thus continues to the next line, commenting out x = 0.

Source: comment by SteveB in this discussion thread.