Переменные и константы C # ведут себя по-разному во время переполнения. - PullRequest
0 голосов
/ 12 мая 2018
 const int cMax = int.MaxValue;
 int vMax = cMax;
 int int1;
 int int2;
 int1 = cMax + 10;//Checked amd throws error
 int2 = vMax+10;//Unchecked and Overflows at runTime

Здесь видно, что операции с константой проверяются по умолчанию, а операция с переменной не проверяется и проходит компиляцию.

Почему эта разница в поведении компиляции?

Ответы [ 2 ]

0 голосов
/ 12 мая 2018

Почему это различие в поведении компиляции?

Обычно люди не ожидают переполнения переменной при написании кода.Лучше всего сообщать им всякий раз, когда компилятор может, что это вызовет переполнение.Если программист действительно хочет, чтобы операция была переполнена, он может закрыть компилятор, добавив unchecked(...).

. Если вы используете константы времени компиляции, компилятор может оценить значения этих констант и сказать вам, что этоможет вызвать переполнение.Если у вас есть переменные, компилятор не знает, какие значения имеют переменные, поэтому он не может точно сказать, будет ли операция переполнена.

0 голосов
/ 12 мая 2018

Поведение отличается, потому что cMax + 10 является константным выражением. Согласно справочнику C # ,

Постоянное выражение - это выражение, которое может быть полностью оценено во время компиляции. Константа может участвовать в выражении константы следующим образом:

public const int c1 = 5;  
public const int c2 = c1 + 100;

По умолчанию выражение, содержащее только постоянные значения, вызывает ошибку компилятора, если выражение создает значение, выходящее за пределы диапазона целевого типа. Если выражение содержит одно или несколько непостоянных значений, компилятор не обнаруживает переполнение.

Следовательно, компилятор должен оценивать ваше выражение во время компиляции. Поскольку он не может выдать правильное значение в результате вычисления, он вызывает ошибку во время компиляции. Используйте checked ключевое слово , чтобы включить проверку переполнения для целых чисел.

...