18

ループが完了するまで整数値を増やし続ける for ループがあります。したがって、制限 n が double 変数で、インクリメントされる変数 'i' が整数の場合、i はその制限を超えてインクリメントされます。

 double total = 0;
 double number = hugetValue;
 for (int i = 1; i <= number; i++)
 {
    total = total + i;
 }
 return total;

容量を超えた場合、「i」はどうなりますか? i の値はどのように変化しますか? 実行時エラーが発生しますか?

4

3 に答える 3

13

intINT_MAX から INT_MIN にラップアラウンドする C の一部の実装の動作と同様に(ただし、実際には ISO 標準によると未定義の動作です)、C# もラップします。VS2008 で次のようにテストします。

int x = 2147483647;
if (x+1 < x) {
    MessageBox.Show("It wrapped...");
}

メッセージボックスが表示されます。

あなたhugetValueが最大int値よりも大きい場合、これによりループが永遠に実行されます。

たとえば、2147483648が に近づいていると思うと、intが から2147483647に戻り-2147483648、ループが続きます。

于 2010-06-24T07:46:43.683 に答える
3

これが失礼に思われる場合は申し訳ありませんが、これを自分で試してみると、さらに多くのことを学ぶことができます.

編集済み:ああ、あなたはそれを試してみて、予期しない結果を得ました。他の場所で説明されているように、C ライクな言語は整数演算を静かにラップする傾向があります。オーバーフローをチェックするコストが高い場合、これは一般的に非常に合理的な動作です。これが発生する可能性があることがわかったら、特に例の構成の種類に注意して、慎重にコードを作成します。

于 2010-06-24T07:46:03.243 に答える
2

例外が必要な場合は、checkedコンパイラ オプションを指定するかchecked、C# で提供される構成を使用します。

于 2010-06-24T07:55:57.350 に答える