エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

C言語の条件演算子で第2オペランドを省略できるのはGNU拡張だった

#include <stdio.h>

void putStrLn(const char* s)
{
    printf("[%s]\n", s ? : "null pointer"); /* 条件演算子 ( ? : ) の第2オペランドを省略 */
}

int main(int argc, char* argv[])
{
    putStrLn("hoge");
    putStrLn("");
    putStrLn(NULL);

    return 0;
}


実行結果。

[hoge]
[]
[null pointer]


条件演算子三項演算子とも)である ? : の書式は、

operand1 ? operand2 : operand3

ですが、このうち第2オペランドを省略すると、第1オペランドの値が真の場合、式の値は第1オペランドの値になる…というのがありまして。これをどこで覚えたか忘れてしまい、そもそもこれは仕様なのか?としばらく悩み。文法の定義を見てもそれらしい記述はないので仕様ではないだろうとあたりをつけるも、検索してみてもヒットせず。というかGoogleで「?:」とやってもぜんぜんダメ。

数日かかって、ようやくen.wikipedia.orgで記述を発見しました。

GNU拡張とわかり、GCCの仕様を確認。

ようやくすっきり。ふだんGCC一種類しか使ってないと、こういうところで右往左往するという例。


-pedantic(または-pedantic-errors)のオプションを付ければ警告(またはエラー)になるようなので、こんど悩むことがあったらまずはこれを試してみようと思うのでした。