4

プログラムで次のループを使用している場合、C# 4.0 ではループが終了しません。

for (int i = 1; i <= int.MaxValue; i++)
{
}

これは、int.MaxValue (2147483647) に 1 を追加してもオーバーフロー例外にはならず、-2147483648 になるためです (32 ビット int と 2 の補数を考慮して)。

int i = int.MaxValue;
Console.WriteLine(i + 1);

最近、挙動が変わったようです。算術演算が OverflowException を引き起こしたという質問を参照してください。この変更の背後にある理由は何ですか?

4

1 に答える 1

10

整数 (およびその他の整数型) のオーバーフロー例外は、checkedコンテキストでのみ実行されます。

したがって、これにより例外が発生します。

checked
{
 int i = int.MaxValue;
  Console.WriteLine(i + 1);
}

単にオーバーフローするよりもコストがかかるため、デフォルトではこれを行うように設定されていません。

MSDN から:

checked キーワードは、整数型の算術演算と変換のオーバーフロー チェックを明示的に有効にするために使用されます。

と:

オーバーフロー チェックは、コンパイラ オプション、環境設定、checked キーワードの使用によって有効にできます。


これは最近の変更ではありません。C# は初日からこのようになっています。質問に表示されるのは、デフォルトでチェックされたコンテキストにあるVB.NETコードです。

したがって、既定値を維持すると、VB.NET のオーバーフロー コードは例外をスローしますが、C# の同一のコードはスローしません。

于 2011-08-19T13:47:10.830 に答える