Сложение с преинкрементом, теряющим 1

Почему TestAddition дает 12 вместо 13? Должно быть 5 + 1 + 7 = 13, но утверждение не выполняется с

Ожидается: 13

Но было: 12

int method(int a)
{
    return 7;
}

[Test]
public void TestAddition()
{
    int row = 5;
    row += method(++row);

    Assert.AreEqual(13, row, "Why is it twelve instead of 13?");
}

person jahav    schedule 14.11.2015    source источник
comment
Непонятки C# до и после увеличения   -  person Jason Evans    schedule 14.11.2015


Ответы (2)


Потому что ваш

row += method(++row);

равно

row = row + method(++row);

Поскольку + оператор является с левой ассоциативностью, он сначала вычисляет row как 5, а method всегда возвращает 7 независимо от, какой параметр он принимает.

row = row + method(++row);
       ^          ^
       5          7

Поэтому результат будет 12.

person Soner Gönül    schedule 14.11.2015

row += method(++row);

такой же как

row = row + method(++row);

Операнды оцениваются слева направо, поэтому значение левого операнда (row) оценивается до того, как row увеличивается на method(++row).

Ожидаемый результат 12.

person Jakub Lortz    schedule 14.11.2015