これがわかればC言語雑学王!?謎のオペレータ「??!??! 」が話題に

File0001438084802

最近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などでも実際に使うことができ、ドキュメントもあります。

2015 04 20 004816

Visual Studio 2013で実際にコンパイルできました。ただしコンパイルオプションで「/Zc:trigraphs」を指定する必要はあります。ソースコードが難解になることや、デフォルトで無効化されていることから考えても、チーム開発ではトライグラフを使うのはさけたほうが良さそうです。

スポンサーリンク