Если значение переменной x
изначально равно 0, выражение x += x += 1
будет оцениваться как 2 в C и 1 в Javascript.
Семантика для C кажется мне очевидной: x += x += 1
интерпретируется как x += (x += 1)
, который, в свою очередь, эквивалентен
x += 1
x += x // where x is 1 at this point
В чем заключается логика интерпретации Javascript? Какая спецификация обеспечивает такое поведение? (Следует отметить, кстати, что Java соглашается с Javascript здесь).
Update:
Оказывается, выражение x += x += 1
имеет поведение undefined в соответствии со стандартом C (спасибо ouah, Джон Боде, DarkDust, Дрю Дорманн), который, кажется, испортил всю точку вопрос для некоторых читателей. Выражение можно сделать стандартным, вставив в него функцию идентификации: x += id(x += 1)
. Та же модификация может быть внесена в код Javascript, и вопрос остается прежним. Предполагая, что большинство читателей могут понять суть "нестандартной" формулировки, я сохраню ее, поскольку она более кратка.
Обновление 2: Оказывается, что, согласно C99, введение функции тождества, вероятно, не решает двусмысленность. В этом случае уважаемый читатель, пожалуйста, рассмотрите исходный вопрос как относящийся к С++, а не к C99, где "+ =" теперь, вероятно, теперь можно смело считать перегружаемым оператором с однозначно определенной последовательностью операций. То есть x += x += 1
теперь эквивалентно operator+=(x, operator+=(x, 1))
. Извините за долгий путь к соблюдению стандартов.