最近Redditで、C言語のオペレータ「??!??!」が一体何を意味しているのかが、話題となっていました(Reddit)。これは、もともと2013年にStack Overflowに書き込まれた「次のソースコードがコンパイルできるし、動かすこともできるけれど、オペレータ『??!??!』が何を意味しているかわからない」という質問に由来しています。
!ErrorHasOccured() ??!??! HandleError();
文字化けではなく実際に合計6文字からなるオペレータなのです。C言語経験者でも目を疑うこのソースコード、実際は意外と簡単な内容を意味しています。
目次
トライグラフと呼ばれるものだった
Stack Overflowで回答者が答えているように、「??!」はトライグラフと呼ばれ3文字が「|」に変換されます。これが2個繰り返されるということは
!ErrorHasOccured() ??!??! HandleError();
↑これは
!ErrorHasOccured() || HandleError();
↑これになるということです(単なるor)。
わかってしまえば簡単ですが、知らないと検索するのにも苦労しそうですね。
Wikipediaによると、トライグラフとは「ISO 646 に共通して含まれる文字だけでソースコードを書くための表記法」で、例えばVisual Studio 2013などでも実際に使うことができ、ドキュメントもあります。
Visual Studio 2013で実際にコンパイルできました。ただしコンパイルオプションで「/Zc:trigraphs」を指定する必要はあります。ソースコードが難解になることや、デフォルトで無効化されていることから考えても、チーム開発ではトライグラフを使うのはさけたほうが良さそうです。