2

初期化されていない「max」と「min」の値がLinuxで機能するのに、Windowsでは機能しないのはなぜですか。例えば:

double max, min, test;
while (1)
{
  std::cin >> test;
  if (test > max)
    max = test;

  if (test < min)
    min = test;
}

これはLinuxで機能します。私はこれを少なくとも3か月間使用しているので(これがどれほどひどいのか今まで気づいていませんでしたが)、事実を知っています。しかし、私は多くの同僚から、これは彼らのマシンでは壊れていると言われました。彼らはVisualStudioを使用してコンパイルします。彼らの発言にはある程度の妥当性がありますか、そしてその理由は何ですか?これは単にUBの場合ですか?もしそうなら、私が気付かないうちに過去数ヶ月間どのように機能してきましたか?

注:gcc(Ubuntu / Linaro 4.5.2-8ubuntu4)4.5.2およびVisual Studio 2010

4

4 に答える 4

8

これは、プラットフォームなしで「機能」します。

未定義動作を呼び出すだけです。「私が期待したことをしているようだ」は、 UBがそれ自体を実現するための1つの方法にすぎません。ただし、コードが正常であると信じ込ませるため、ある日顧客の顔に爆発するまでは、かなり残念なことです。

于 2012-06-08T14:28:50.520 に答える
6

未定義の動作は未定義だからです。それはうまくいくかもしれないし、うまくいかないかもしれない、あなたは知らない。どうやら、あなたのLinux環境では、それは動作します。

于 2012-06-08T14:27:20.950 に答える
3

初期化されていない変数の値を使用することは未定義の動作であるため、何が起こる可能性もあります。何か、つまりコードが機能しているように見えたり、クラッシュしたり、悪魔が鼻から飛び出したりする可能性があります。

于 2012-06-08T14:27:34.293 に答える
3

大まかに言えば、初期化されていない変数が、で遭遇した実際の最小値と最大値を比較する値を保持している場合、コードは機能しているようにmin見えmaxますtest。初期化されていない自動変数のオブジェクト表現は、コンパイラ、オプション、およびプログラムの残りの部分のコードに応じて、一貫している場合とそうでない場合があります。初期化されていない値を読み取ることは確かにUBです。UBは一貫している場合とそうでない場合があります。

したがって、たとえば、観察した動作を取得する簡単な方法の1つは、次の場合です。

  • テストセットにはすべて、正の値と負の値の両方が含まれています。
  • gcc / linuxは、初期化されていない変数に常にすべてビットゼロの表現を入れます。
  • VSは、初期化されていない変数に一貫してNaNを配置します(したがってtest < mintest > max両方とも常にfalseです)。

テストデータが何であるか、および「マシンで壊れている」とはどういう意味かによって、詳細が異なる場合があります。UBの無限の範囲からの1つの可能性について説明しました。

于 2012-06-08T14:48:45.653 に答える