646:1983の不変文字セットの範囲で記述するための悪名高い記法。646にない文字を表現する。646しか使えないレガシーな環境でもCのプログラムが書けるように配慮されて導入された仕様である。この仕様は、C++にもそのまま採用されている。646は、ASCIIの拡張として、ASCIIにある12文字を任意の文字に変えても良い、という規格である。いうC/C++でよく使う文字が含まれており、そのままではCらしいコードが書けないと危惧されたことから、この仕様の導入が決定された。646しか使えないレガシーな環境でCソースをコンパイルする機会などほぼ皆無(?)である。646が完全に過去となった今ですらなお廃止はされていない。このため余計な解釈で意図しない文字が現われて混乱のもとになることのほうが多いが、ANSI準拠のためにはトライグラフを解釈できる必要がある。トラブルの方が多いため、たいていのC/C++コンパイラーはオプションを付けて機能が有効になるようにしていることが多い。GCCではデフォルト無効。-trigraphsオプションで有効になる。clang/LLVMでもデフォルト向こうで、-Wtrigraphsで有効になる。C/C++では常に有効。?を\?とエスケープすることで解釈を抑止できる。公害でしかなくなったこの仕様は、C++では、C++1zあるいはC++17と呼ばれている策定中の仕様において、削除されることが議論されている。現状、トライグラフには需要が存在せず、コードを書く妨げにしかなっていない。おいてトライグラフを仕様から取り除く議論がなされることとなった。