• ベストアンサー

VC2005においてif文が正しく評価されない

環境: WindowsXP SP2 VC2005 下記ソースをデバッグしています(F10によるステップ実行)。 if文の直前で変数aの値を-1など、0未満へ変更し、 そのままステップ実行しても、なぜかif文の中に入りません。 本来であれば、-1は0未満であるため、if文の判定は真と判定 されるべきであると思います。 個人的に「a = b - c」の式が悪さをしているのではないかなと 考えています。 なぜこのような現象が起こるのでしょうか? int main(void) { long a = 0; long b = 2; long c = 1; a = b - c; if( a < 0 ){ return 0; } }

質問者が選んだベストアンサー

  • ベストアンサー
  • aris-wiz
  • ベストアンサー率38% (96/252)
回答No.13

>> AsanoNagiさん 補足ありがとうございます。 >a = a があると、これが、「直前の式」なので、 >この結果をもとに、 if () の判定を指定 VC2005でこれを確認してみました。 XP HE VC2005 ビルドしたコード int main(void) { long a = 0; long b = 2; long c = 1; long* d = &a; a = b - c; a=a; if( a < 0 ){ return 0; }else{ return 1; } } 上記のコードで出力されたアセンブラコード ; Line 9 cmp DWORD PTR _a$[ebp], 0 jge SHORT $LN2@main となり動作が変わるようです。 結局のところ、コードを変更せずにIF文を成立させた 動作にするには直前の計算式「a = b - c;」でbかcを変更して 減算結果を負の数にしなければならないようです。

y3k
質問者

お礼

お返事が遅くなりまして申し訳ありません。解決です。 皆さんのご回答については全て拝見しておりますが、 こちらへまとめてお礼をいたしたいと思います。 最初は皆さんの環境においては再現されなかったため、 戸惑っておりましたが、正直ホッとしております。 直前の式の評価、またVCのバージョンによって、 動作が異なるということで一つ勉強になりました。 知識不足のためアセンブルについては、再度自身の 環境と照らし合わせて行こうと考えております。 これにて終了とさせていただきます。 皆さんありがとうございました。

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

その他の回答 (12)

回答No.2

Visual C++ は見たことがないので何ともいえませんが……。 普通、ステップ実行をしたとき、反転表示などされた行は、これから実行される行で、実行された行ではありません。 ということで、推測ですが、 a = b - c; が、反転表示(など)された時点で、 a = -1 と設定しているということはないでしょうか? ここで、ステップ実行をすると、この後で、 a = b -c が実行されてしまいます。 ですから、if() の(実行の)直前は、if() の行が反転表示(など)されたときになります。 ここで、 a = -1 と設定すれば、お考えの結果になるかもしれません。 もう一つ考えられるのは、「最適化」というものの存在です。 最近のコンパイラは、それなりに賢いので、このコードをコンパイルするときに、 ・ a, b, c を計算して if () で処理しているだけ。 ・ a, b, c は計算されているけど、その結果は使われない という判断で、 int main() { return 0: } というプログラムとしてコンパイルしてしまっている可能性もあります。

y3k
質問者

お礼

ご回答ありがとうございます。 ステップ実行の際ですが、「a = b - c」の式が実行され、 変数aの値が0から2-1すなわち1となることを確認したうえで 変数aの値を-1へ変更しています。 また、2点目の最適化についてですが、 極端な話、コード自体を数百行のプログラムの中へ 放り込んだ場合でも同様の現象が起こっていますので、 最適化の可能性は低いような気がします。

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

if文の中に入っても入らなくても結果が同じだからでは?

y3k
質問者

お礼

早速のご回答ありがとうございます。 ご指摘を受けて、if文を以下のように変更してみましたが、 結果としては、変わりませんでした。 また、補足として、VC6.0では本現象は起こりませんでした。 int main(void) { long a = 0; long b = 2; long c = 1; a = b - c; if( a < 0 ){ return 1; } else{ return 2; } return 0; }

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

関連するQ&A