Alternative operator representations (since C95)
C source code may be written in any non-ASCII 7-bit character set that includes the ISO 646:1983 invariant character set. However, several C operators and punctuators require characters that are outside of the ISO 646 codeset: {, }, [, ], #, \, ^, |, ~. To be able to use character encodings where some or all of these symbols do not exist (such as the German DIN 66003), there are two possibilities: alternative spellings of operators that use these characters or special combinations of two or three ISO 646 compatible characters that are interpreted as if they were a single non-ISO 646 character.
[edit] Alternative spellings
There are alternative spellings for several operators defined in <iso646.h>. 
| Defined in header  <iso646.h> | |
| Primary | Alternative | 
| and(macro constant) | |
| and_eq(macro constant) | |
| bitand(macro constant) | |
| bitor(macro constant) | |
| compl(macro constant) | |
| not(macro constant) | |
| not_eq(macro constant) | |
| or(macro constant) | |
| or_eq(macro constant) | |
| xor(macro constant) | |
| xor_eq(macro constant) | |
[edit] Digraphs and trigraphs
The following combinations of two and three characters (digraphs(C95) and trigraphs(C89)) are valid substitutions for their respective primary characters:
| Primary | Digraph | Trigraph | 
|---|---|---|
| { | <% | ??< | 
| } | %> | ??> | 
| [ | <: | ??( | 
| ] | :> | ??) | 
| # | %: | ??= | 
| \ | ??/ | |
| ^ | ??' | |
| | | ??! | |
| ~ | ??- | 
Note that trigraphs (but not digraphs) are parsed before comments and string literals are recognized, so a comment such as // Will the next line be executed?????/ will effectively comment out the following line, and the string literal such as "What's going on??!" is parsed as "What's going on|".
[edit] Example
 The following example demonstrates alternative operator spellings from the <iso646.h> header as well as use of digraphs and trigraphs.
The space character in the first command-line argument, argv[1], requires the quotation marks: ", World!".
%:include <stdlib.h> %:include <stdio.h> %:include <iso646.h> int main(int argc, char** argv) ??< if (argc > 1 and argv<:1:> not_eq NULL) <% printf("Hello%s\n", argv<:1:>); %> return EXIT_SUCCESS; ??>
Possible output:
Hello, World!
| 
C++ documentation for Alternative operator representations
 |