В руководстве PHP, разделе приоритета оператора , приведен пример:
// mixing ++ and + produces undefined behavior $a = 1; echo ++$a + $a++; // may print 4 or 5
Я понимаю, что поведение не определено по следующей причине:
Поскольку x + y = y + x
интерпретатор может свободно оценивать x
и y
для добавления в любом порядке, чтобы оптимизировать скорость и / или память. Я сделал это, посмотрев пример кода C в этой статье .
Мой вопрос заключается в том, что вывод вышеупомянутого PHP-кода должен быть 4
независимо от того, каким образом оценивается выражение и подвыражения:
Откуда взялись эти 5? Или я должен узнать больше о том, как работают операторы?
Редактировать:
Я смотрел на раздел « Расширение / Уменьшение операторов », но все еще не мог понять, почему 5.
++ $ a: Pre-increment – Увеличивает $ a на единицу, затем возвращает $ a.
$ a ++: Post-increment – возвращает $ a, а затем увеличивает $ a на единицу.
a = 1; ++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) ++ (postincrement) gives a = 3 (higher precedence than +) + (add) gives 2 + 3 = 5
$ a изначально устанавливается в 1. ++ $ a затем preincrements $ a перед тем, как использовать его в формуле, установив его в 2 и нажав это значение на стек lexer. Затем выполняется $ ++, потому что инкремент имеет более высокий приоритет, чем +, и это значение также выталкивается в стек lexer; и добавление, которое затем происходит, добавляет результат 2-го слова lexer к результату 3 стека лексера, давая результат из 5, который затем повторяет эхо. Значение $ a после выполнения строки равно 3.
ИЛИ
a = 1; ++ (preincrement) gives a = 2 (higher precedence than +, and LR higher precedence than postincrement) + (add) gives 2 + 2 = 4 (the value that is echoed) ++ (postincrement) gives a = 3 (incremented __after__ the variable is echoed)
$ a изначально устанавливается в 1. Когда формула анализирует, ++ $ a преинкрементирует $ a, устанавливая ее до 2, прежде чем использовать ее в формуле (нажав результат в стек лексира). Затем результат складывается из стека лексера и текущего значения $ a, давая 4; и это значение отражается. Наконец, $ a является постинкрементным, оставляя значение 3 в $ a.
Да, это даст вам 5, потому что оператор правой стороны работает сначала по приоритету / предпосылке, и после этого оператор суммы (+) будет работать. Таким образом, первый приращение делает его равным 2, а второй делает его равным 3, после чего оба будут суммировать и вывести результат в виде 5
$result = ++$a + $a++;
++$a
выходы как 2
$a++
выводит только 2 3, но внутренне он будет увеличиваться.
наконец, сумма будет равна 2 + 3 = 5
Марк, я считаю, что ты ошибаешься!
Post-increment: возвращает $ a, а затем увеличивает $ a на единицу. (из документации)
Таким образом, нет никакого способа получить $ значение 3 в сумме операции.