Как интерпретировать множественное приращение

У меня был этот вопрос на собеседовании, и мне было интересно, что бы вы ответили, если бы у вас был такой же вопрос. Пожалуйста , не тестируйте программу в 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 ответа

Решение

Давайте посмотрим на все

  1. когда вы делаете var myClass = new MyClass();, MyInt = 1, так как вы инициализировали его в конструкторе

  2. когда ты это делаешь myClass.MyInt += myClass.MyInt; MyInt был 1, поэтому вы добавили 1 к себе, так что теперь MyInt это 2

  3. когда ты это делаешь 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, потому что ++( оператор постинкремента) имеет более высокий приоритет, чем + а также + имеет более высокий приоритет, чем =

Другие вопросы по тегам