1. ホーム
  2. c

[解決済み] C言語では「?」演算子は何をするのですか?

2022-03-14 18:31:30

質問

次のようなCの行を見た。

!ErrorHasOccured() ??!??! HandleError();

正しくコンパイルされ、問題なく実行されているようです。エラーが発生したかどうかをチェックして、エラーが発生した場合はそれを処理しているようです。しかし、実際に何をしているのか、どのように処理しているのかはよくわからない。プログラマーがエラーに対する気持ちを表現しているように見えますが。

を見たことがありません。 ??!??! どのプログラミング言語でも見たことがないし、ドキュメントもどこにもない。(Googleでは、次のような検索語は役に立ちません。 ??!??! ). また、そのコードサンプルはどのように動作するのでしょうか?

どのように解決するのですか?

??! トリグラフ に変換されます。 | . と書いてあるわけです。

!ErrorHasOccured() || HandleError();

となり、ショートするため、等価となります。

if (ErrorHasOccured())
    HandleError();

今週の達人 (C++を扱ったものですが、ここにも関係あります)で取り上げました。

トリグラフの起源と思われるもの あるいは、@DwBがコメントで指摘しているように、EBCDICが難しかったためである可能性が高いです(またしても)。 これは IBM developerworksの掲示板での議論は、その説を支持しているようです。

ISO/IEC 9899:1999 §5.2.1.1, 脚注12より (h/t ランダム832 ):

<ブロッククオート

トリグラフ・シーケンスにより、インバリアント・コードセットで定義されていない文字を入力することができます。 ISO/IEC 646に記載されている、7ビットのUS ASCIIコードセットのサブセットである。