- 締切済み
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 ただし一つだけ懸念があります。 このような条件式を手動で最適化しようとする場合、なるべく処理の軽い条件式が左に来るように並べ替えようと考えます。 同じようなことをコンパイラが勝手にやってしまわないかという点です。最適化のレベルや設定によっては、そのようなこともあり得るかどうか知りたいです。そのような場合、当然プログラマの意図とは異なる順序で評価されてしまい、上の例のような場合はランタイムエラーを引き起こします。
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- wormhole
- ベストアンサー率28% (1626/5665)
- chachaboxx
- ベストアンサー率23% (412/1777)
- chachaboxx
- ベストアンサー率23% (412/1777)
- wormhole
- ベストアンサー率28% (1626/5665)
- maiko0333
- ベストアンサー率19% (839/4401)
お礼
調べ方が足りなかったのでしょうか。そのものずばりの記述がありました。想定通りでした。 Unlike &, && guarantees left-to-right evaluation: the second operand is not evaluated if the first operand is false.