ゆとりーなの日記

日記的な事を書いて行くと思はれる

短絡評価とはなんだったのか

タイトルに釣られました。

俺のコードのどこが悪い?―コードレビューを攻略する40のルール
俺のコードのどこが悪い?―コードレビューを攻略する40のルール藤原 克則

秀和システム 2011-03
売り上げランキング : 8699


Amazonで詳しく見る
by G-Tools
まだ読み途中なんですが、一つコラムで気になる点があったので。
C/C++の言語仕様では次のような条件判定があったとき

if ((i == 1) || (j == 2) || (k == 3)) {...}

i、j、kに対する判定順が実装依存であるって書いてあるんですね。
私の記憶によると、C/C++hあ条件判定に於いては短絡評価を採用しているはずなので

if ((NULL != p) && (p->f1 != 1)) {...}

って表記はNULLが左に来てるのはどうなのよっていうツッコミは置いておいても合法なはずなんですけどね。どうも関数の引数の評価順とごっちゃになってるような気がします。
ただ、一つ気になる記述もあって、評価順序に依存した既存のコードが多いので、多くの一般的なコンパイラは記述順どおりに処理するコードを生成するようになったようなことが書かれています。組み込みでもGCCベースのコンパイラが普及しているからそんなに気にしなくてもよくなってきているような感じのことも書いてあります。組み込みまわりは確かに怪しいコンパイラがありそうな気がしないこともないですので。
この辺りの事実関係はどうなんでしょうか。この本の結論としては、言語仕様上では「たまたま動作する程度に過ぎない」とされています。
まぁC++0xの経典N3242には5.14のLogical AND operatorのところに「最初のオペランドが誤っているなら、2番目のオペランドは評価されません。」的なことが書いてあるんですけどね!
追記:
twitter上でfinalfusion氏から指摘されたので確認したところ、本の正誤情報のところに入ってました。
技術系執筆情報
やはり短絡評価ってことでいいみたいですね。