5

以下のコードを参照してください。その背後にある理由を理解したいだけです...

const int a = 2147483647;
const int b = 2147483647;

int c = a + b; // it doesn't allow to compile!!! 

int a = 2147483647;
int b = 2147483647;

int c = a + b; // it allows to compile!!!
4

3 に答える 3

4

const式はコンパイル時に解決され、非const式は実行時に解決されます。デフォルトでは、それぞれに異なるタイプのオーバーフロー チェック コンテキストがあります。C# 仕様によると:

チェックまたはチェックされていない演算子またはステートメントで囲まれていない非定数式 (実行時に評価される式)の場合、 外部要因 (コンパイラ スイッチや実行環境の構成など) によって呼び出されない限り、既定のオーバーフロー チェック コンテキストはチェックされません。チェック評価。

これが、ローカル変数を使用して算術を行うときに実行時エラーが発生しない理由です。const計算に関しては:

定数式 (コンパイル時に完全に評価できる式)の場合、デフォルトのオーバーフロー チェック コンテキストは常に checkedです。定数式がチェックされていないコンテキストに明示的に配置されていない限り、式のコンパイル時の評価中に発生するオーバーフローは常にコンパイル時エラーを引き起こします。

constこれが、計算でコンパイル時エラーが発生する理由です。

MSDN のチェック済みおよび未チェックの詳細情報

于 2012-12-07T01:49:08.183 に答える
2

定数値の場合、コンパイラーは基本的に、コンパイル時に変数を定数値に置き換えます。したがって、コンパイル時に加算ステートメントを評価すると、値を認識してオーバーフロー状態を確認できます。

整数型変数の場合、コンパイラーはコンパイル時に割り当てられた値を実際に考慮に入れるのではなく、実行時に式を評価すると思います。

しかし、C#は、チェックがデフォルトで無効になっていることがわかりました。オプションでオンにできます。理由と方法については、JustinEtheredgeの優れたブログ投稿を参照してください。

http://www.codethinked.com/c-trivia-what-no-overflow

于 2012-12-07T01:37:26.843 に答える
0

コンパイラーはconst変更できないことを知っているのでa+b失敗すると思います。ただし、他の変数を使用すると、実行時に変更できるため、コンパイラーは、設定された値が有効な値に変更されないと想定しません。

于 2012-12-07T01:35:09.107 に答える