コンパイルオプション変更での挙動の変化

解決


 2011-03-03 16:09:21  No: 72393  IP: [192.*.*.*]

環境:WinXP SP3 VC++6

いつもお世話になっております。
メニュー→プロジェクトの設定→C/C++で変更できる、
最適化で、実行速度(O2)もしくはプログラムサイズ(O1)を指定すると
挙動が変わるのですが何故こうなるのか教えて頂きたいです。
参考になるページでも良いのでお願い致します。

void hoge(int i, int ii)
{
  CString s;
  s.Format("%d %d\n", i, ii);
  AfxMessageBox(s);
}
void CMyTestDlg::OnButton1() 
{
  for(int i=0; i<5;)
    hoge(i++, i);
}

結果:
コンパイルオプションO2もしくはO1
0 1
1 2
2 3
3 4
4 5

コンパイルオプションODもしくはD
0 0
1 1
2 2
3 3
4 4

リリースの時のみ強制終了するバグを調べてたら行き着きました。
これって結構常識なんでしょうか・・・
オプション次第で挙動が変わる別の例などもあったら是非ご教授下さい。

編集 削除
瀬戸っぷ  2011-03-03 16:59:21  No: 72394  IP: [192.*.*.*]

>最適化で、実行速度(O2)もしくはプログラムサイズ(O1)を指定すると
>挙動が変わるのですが何故こうなるのか教えて頂きたいです。

>hoge(i++, i);

未定義動作だから…じゃないですか?
http://social.msdn.microsoft.com/Forums/ja-JP/csharpexpressja/thread/23f65ca3-9cf6-49b4-9975-23a26fee4f20

編集 削除
 2011-03-03 17:23:11  No: 72395  IP: [192.*.*.*]

瀬戸っぷ様

ご回答ありがとうございます、理解しました。
思い込みで勝手に書くとドはまりしますね。
調べてまた基礎から出直します・・・

編集 削除
 2011-03-03 17:24:22  No: 72396  IP: [192.*.*.*]

すみません解決を入れ忘れました。

編集 削除