何とは言わない天然水飲みたさ

C言語の条件演算子に関する雑記

Wikipediaで例示されている、e = a ? b : c = d;のような文において現れる。

Cのように第3オペランドがconditional-expressionであれば、e = ((a ? b : c) = d);のように解釈され、条件演算子が代入の左辺となる。 これはC言語においてはエラーである。 (一応、大昔にはこれを可能にするgcc拡張も存在した。後述。)

一方、C++のように第3オペランドがassignment-expressionであれば、e = (a ? b : (c = d));のように解釈される。 C++特有の機能を使っていないからと言って、拡張子をcに直してしまうとコンパイルが通らなくなる例だ。

条件演算子による式を左辺値として使えるようにするgcc拡張

  • Lvalues - Using the GNU Compiler Collection (GCC)
    • gcc-3.4.6 (gcc-3の最後のバージョン、リリース)における、当該拡張のドキュメント。
    • Lvalues: Using `?:', `,' and casts in lvalues.
    • 条件演算子どころか、コンマやキャストによる式でさえも左辺値にできるという拡張である。
  • C Extensions - Using the GNU Compiler Collection (GCC)
    • gcc-4.0.0 (gcc-4の最初のバージョン、リリース)における、C拡張一覧のドキュメント。
    • Lvalues拡張が消えている

どうやら10年以上前に廃止された拡張だったらしい。
コンパイラ拡張をできるだけ使わないように生きてきたとはいえ、今日に至るまで全く気付かなかったのは結構ショックだ。