Об операторах присваивания JavaScript и PHP: почему разные результаты?

#javascript #php

#javascript #php

Вопрос:

Код JavaScript:

 var a = 1, b = 2;
a = b   (b = a) * 0;
// result a = 2, b = 1;
 

PHP код 1:

 $a = 1;
$b = 2;
$a = $b   ($b = $a) * 0;
// result $a = 1, $b = 1;
 

PHP код 2:

 $a = 1;
$b = 2;
$a = (int)$b   ($b = $a) * 0;
// result $a = 2, $b = 1;
 

В чем разница между операторами присваивания PHP и JavaScript?

Связано ли это с приоритетом оператора?

Я хочу знать, в чем причины. Спасибо!

Комментарии:

1. Я подозреваю, что ни один язык не определяет, что произойдет, если вы присвоите переменной и используете ее в том же выражении. Но если они это делают, то разница заключается в порядке операций.

2. Почему вы вообще пишете такой искаженный код? Нет никакого оправдания для смешивания присваивания в выражении, подобном этому.

3. $ a = 1; $ b = 2; $ a = $ b (($ b = $ a) * 0);

4. Я не думаю, что это реальная проблема программирования. Голосование за закрытие. Это было бы лучше для программистов.*

Ответ №1:

Нет, приоритет оператора не влияет на порядок вычисления, поэтому использование присваиваний в сложных оценках, повторно использующих результат оценки, всегда не определено.

Из руководства по PHP:

Приоритет и ассоциативность операторов определяют только то, как группируются выражения, они не определяют порядок вычисления. PHP не указывает (в общем случае), в каком порядке вычисляется выражение, и следует избегать кода, который предполагает определенный порядок вычисления, поскольку поведение может меняться между версиями PHP или в зависимости от окружающего кода.

Короче говоря, вывод $b ($b = $a) не определен, поскольку группировка переопределяет приоритет и в любом случае не обеспечивает выполнение, выполняется ли присваивание до извлечения левого операнда добавления или после. Приоритет четко определен, порядок выполнения / оценки — нет.

Комментарии:

1. вот почему у нас не может быть ничего хорошего в этой жизни!!!! Как возможно, что PHP не гарантирует порядок выполнения. теперь официально ненавижу PHP немного больше.!

2. Спасибо за ваш восторженный ответ

Ответ №2:

Чтобы дополнить ответ @NielsKeurentjes с точки зрения JavaScript:

(В отличие от PHP) JavaScript определяет порядок операций (операнды вычисляются слева направо), что позволяет работать так, как ожидалось.

Из спецификации ECMAScript:

Производительность AdditiveExpression : AdditiveExpression MultiplicativeExpression оценивается следующим образом:

  1. Пусть lref будет результатом оценки AdditiveExpression .
  2. Пусть lval будет GetValue(lref) .
  3. Пусть rref будет результатом оценки MultiplicativeExpression .
  4. Пусть rval будет GetValue(rref) .

Комментарии:

1. Хорошая находка, я не смог найти эту часть спецификации, чтобы дополнить свой собственный ответ. 1