• 締切済み

if文の中の条件式の評価順序について

if文の中に複数の条件式を&&演算子で結合した場合、評価順序のルールは環境によらず確定していると考えて良いでしょうか? 例として、下記のようなコードはあらゆる環境で安全であると保証できますか? ---------------------------------- CMyData* pData = new CMyData; // new演算子が失敗した場合は常にNULLを返すものとする。 if( pData != NULL && pData->HogeHoge() ) // pDataがNULLならpData->HogeHoge()はNULLポインタ参照例外 { // Do something } 条件式が左から右へと順に評価されたとして(これは言語仕様上間違いない)、最初にfalseと評価された時点で残りの条件式に関わらず条件式全体の評価はfalseと確定します。 自分より左側の条件式がfalseであった場合に、実行されると危険なコードを条件式として記述することに問題はないか? &&演算子だけでなく||演算子も気になります。 ||演算子の場合は、最初にtrueになった時点で条件式全体の評価はtrueと確定します。その時点で残りの条件式は評価されないことが保証されているのでしょうか? 私の環境でデバッグ版、リリース版でそれぞれ試してみましたが、この予想通りの結果になっていました。 Windows7 x64 VS2005 ただし一つだけ懸念があります。 このような条件式を手動で最適化しようとする場合、なるべく処理の軽い条件式が左に来るように並べ替えようと考えます。 同じようなことをコンパイラが勝手にやってしまわないかという点です。最適化のレベルや設定によっては、そのようなこともあり得るかどうか知りたいです。そのような場合、当然プログラマの意図とは異なる順序で評価されてしまい、上の例のような場合はランタイムエラーを引き起こします。

みんなの回答

  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.5

>仕様がどのようになっているのか確認したかったのです。 ANSI CやISO Cの規格を確認しましょう。

katorea21
質問者

お礼

調べ方が足りなかったのでしょうか。そのものずばりの記述がありました。想定通りでした。 Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.

すると、全ての回答が全文表示されます。
  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.4

再回答です。余談です。(笑) 行数が無駄に多いコードは百害あって一利なしですが、あまりに処理を圧縮したコードはメンテナンス性に欠け、無用なコメントが増えるので本末転倒な気がします。綺麗なコードはポエムとはよくいったもので、ムダがなく明朗でかつ見た目もキレイなコードは得てして何故か速かったりします。行数を減らしてもRISC命令の処理クロックが減るとは限らないので、数行増えても全体の見通しをよくして、アルゴリズムにテコ入れしたくなる様なデザインにしておけばそのうち誰かがメンテしてくれる期待もありです。(笑) 具体的な回答に及ばず失礼しました。

katorea21
質問者

お礼

世の中には少しでも短くシンプルに書くことにエクスタシーを感じる人もいるようです。1つのif分に複数の条件を並べたり多重ネストしたりと、少し読んだだけでは意図が理解しがたいコードにもよく出くわします。 ただ、テストの目標が「1000行あたりX件の不具合を発見する」などとなっていることも良くあり、その数字を実現するためになるべく分母を小さくしようと努力した結果なのかも知れません。本末転倒ですが、見える化などと言って目標を数値化すると、人間はその数値にしか目が行かなくなってしまうようです。余談でした。

すると、全ての回答が全文表示されます。
  • chachaboxx
  • ベストアンサー率23% (412/1777)
回答No.3

コンパイラが環境に依存するコードを吐くとは思えませんが、コンパイラが勘違いしないようなロジックにするのが良いプログラムだと思います。 偽を否定するより真を評価しなから非常口を設けるのがモヤモヤしなくていいと思います。

katorea21
質問者

お礼

確かにそうですね。このような書き方を好む人は、トリッキーな書き方に酔っている場合もありますが、一方でなるべく行数を減らしたいという理由もあるように思います。

すると、全ての回答が全文表示されます。
  • wormhole
  • ベストアンサー率28% (1626/5665)
回答No.2

>例として、下記のようなコードはあらゆる環境で安全であると保証できますか? CやC++の規格に準拠しているのでしたら保証できます。 >同じようなことをコンパイラが勝手にやってしまわないかという点です。 評価順番が仕様上決まってるものについてはしません。

katorea21
質問者

お礼

仕様がどのようになっているのか確認したかったのです。もし仕様で明確に決まっていなければ、今は良くても今後他の処理系に移植したりした場合に不具合を引き起こす可能性があります。

すると、全ての回答が全文表示されます。
  • maiko0333
  • ベストアンサー率19% (839/4401)
回答No.1

「言語仕様なので確定的に動作する」から 使うというのは間違いではありません。 ただ、コードが読みにくくなったり、 一見してどっちだっけな?というような コードは書くべきではないと考えます。 言語によって似てるものが違う動きをするようなコードは 特に書くべきではないですね。

katorea21
質問者

お礼

確かにそうですね。普段あまりこのような書き方はしませんが、既にあるコードでこのような書き方をよくしているので気になったのです。

すると、全ての回答が全文表示されます。

関連するQ&A