2015-11-14 9 views
1

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

Ожидаемое: 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?"); 
} 
+0

[C# Pre- & Post Increment confusions] (http://stackoverflow.com/questions/8573190/c-sharp-pre-post-increment-confusions) –

ответ

3

Поскольку ваш

row += method(++row); 

равна

row = row + method(++row); 

С + operator является left associative, он вычисляет первый row как 5 и method всегда возвращают 7вне форума, какой параметр он принимает.

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

Именно поэтому результатом будет 12.

1
row += method(++row); 

такая же, как

row = row + method(++row); 

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

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