#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で記述を発見しました。
ようやくすっきり。ふだんGCC一種類しか使ってないと、こういうところで右往左往するという例。
-pedantic
(または-pedantic-errors
)のオプションを付ければ警告(またはエラー)になるようなので、こんど悩むことがあったらまずはこれを試してみようと思うのでした。