Как интерпретировать множественное приращение
У меня был этот вопрос на собеседовании, и мне было интересно, что бы вы ответили, если бы у вас был такой же вопрос. Пожалуйста , не тестируйте программу в IDE.
public class MyClass
{
private int _myInt;
public int MyInt
{
get { return _myInt; }
set { _myInt = value; }
}
public MyClass()
{
MyInt = 1;
}
}
Что эта программа должна печатать на экране? тем важнее почему!
var myClass = new MyClass();
myClass.MyInt += myClass.MyInt;
myClass.MyInt = myClass.MyInt +++ 2;
Console.WriteLine(myClass.MyInt);
3 ответа
Давайте посмотрим на все
когда вы делаете
var myClass = new MyClass();
, MyInt = 1, так как вы инициализировали его в конструкторекогда ты это делаешь
myClass.MyInt += myClass.MyInt;
MyInt был 1, поэтому вы добавили 1 к себе, так что теперьMyInt
это 2- когда ты это делаешь
myClass.MyInt = myClass.MyInt +++ 2;
; MyInt был 2, и вы добавили 2 к нему, чтобы он стал 4, что подразумевает post ++, инкремент после присваивания (в данном случае), поэтому он присваивает 4 вMyInt
следовательно, ответ должен быть 4,
но это был очень простой случай, и этот ответ почти утверждает, что post ++ означает evaluate current expression then increment
а pre ++ означает increment then evaluate current expression
, но это не совсем так (кажется, что в вашем случае), узнайте больше об этом здесь, от самого дизайнера языков
Если вы напишите третью строку немного иначе, она станет немного понятнее:
myClass.MyInt = myClass.MyInt++ + 2;
Постинкремент возвращает 2, а затем увеличивается. Результат равен 2, и к нему добавляется 2. Затем результат увеличения записи снова перезаписывается результатом добавления (2+2)
Ответ будет 4, потому что ++
( оператор постинкремента) имеет более высокий приоритет, чем +
а также +
имеет более высокий приоритет, чем =