Ух ты, я тоже получил 11. Я думаю, что k получает 3, а затем один раз 5 для добавления. Если сделать только int k = (k=2)+(k=3)
, то получится 6, а int k = (k=2)+(k=4)
- 8, а int k = (k=2)+(k=4)+(k=5)
- 13. int k = (k=2)+(k=4)+(k=5)+(k=6)
даст 19 (4 + 4 + 5 + 6).
Моя догадка? Дополнение делается слева направо. Первые два (k = x) выражения добавляются, и результат сохраняется в регистре или в стеке. Однако, поскольку это k + k для этого выражения, оба добавляемых значения равны тому, что в данный момент является k, что является вторым выражением, потому что оно вычисляется после другого (переопределяя его присваивание k). Однако после этого начального добавления результат сохраняется в другом месте, поэтому теперь он защищен от подделки (изменение k не повлияет на него). Двигаясь слева направо, каждое последующее добавление переназначает k (не влияет на текущую сумму) и добавляет k к текущей сумме.