#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 или в зависимости от окружающего кода.
Короче говоря, вывод $b ($b = $a)
не определен, поскольку группировка переопределяет приоритет и в любом случае не обеспечивает выполнение, выполняется ли присваивание до извлечения левого операнда добавления или после. Приоритет четко определен, порядок выполнения / оценки — нет.
Комментарии:
1. вот почему у нас не может быть ничего хорошего в этой жизни!!!! Как возможно, что PHP не гарантирует порядок выполнения. теперь официально ненавижу PHP немного больше.!
2. Спасибо за ваш восторженный ответ
Ответ №2:
Чтобы дополнить ответ @NielsKeurentjes с точки зрения JavaScript:
(В отличие от PHP) JavaScript определяет порядок операций (операнды вычисляются слева направо), что позволяет работать так, как ожидалось.
Производительность
AdditiveExpression : AdditiveExpression MultiplicativeExpression
оценивается следующим образом:
- Пусть
lref
будет результатом оценкиAdditiveExpression
.- Пусть
lval
будет GetValue(lref) .- Пусть
rref
будет результатом оценкиMultiplicativeExpression
.- Пусть
rval
будетGetValue(rref)
.- …
Комментарии:
1. Хорошая находка, я не смог найти эту часть спецификации, чтобы дополнить свой собственный ответ. 1