2016-03-09 2 views
4

Согласно documentationint.MaxValue является полем int. Когда яКомпилятор реагирует по-разному при присвоении переменной int.MaxValue переменной

int a = int.MaxValue; 
int b = a + 1; 

b имеет значение int.MinValue, как ожидалось. Но когда я

int a = int.MaxValue + 1; 

Я получаю ошибку компиляции

Операция перетекает во время компиляции в зарегистрированном режиме

Почему есть разница?

+0

Не знаю, почему это происходит, просто хочу упомянуть, что это ожидаемое поведение при выполнении в ['checked'] (https://msdn.microsoft.com/en-us/library/74b4xzyw.aspx) block –

+0

'int a = unchecked (int.MaxValue + 1);' –

ответ

2

От https://msdn.microsoft.com/en-us/library/aa691319(v=vs.71).aspx:

Константа-выражение является выражением, которое может быть в полной мере оценены во время компиляции.

и

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

и

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

Так что это объясняет, почему int a = int.MaxValue + 1; дает ошибку компиляции (int.MaxValue является const int).

The

int a = int.MaxValue; 
int b = a + 1; 

отличается, потому что это не является постоянным выражением.Они представляют собой две неконстантные переменные (см. и содержат только перечисленные выше конструкции? Четкое объявление промежуточной переменной не является одной из приемлемых конструкций :-))

+0

Это, кажется, самый точный ответ. –

1

Возможно, ваш компилятор использует параметр checked (который является вариантом по умолчанию), и он говорит;

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

Поскольку как int.MaxValue, так и 1 постоянно, вы получаете сообщение об ошибке.

Если вы используете unchecked опцию, вы увидите тот же результат

unchecked 
{ 
    int a = int.MaxValue + 1; // a is int.MinValue 
} 
2

Разница в том, что в первой строке, вы добавляете две константы. int.MaxValue является константой, а 1 - тоже. Таким образом, компилятор делает расчет во время компиляции и не работает с этим предупреждением.

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

Смежные вопросы