Каким должен быть выход echo ++ $ a + $ a ++

В руководстве 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 независимо от того, каким образом оценивается выражение и подвыражения:

  • op1 = ++ $ a => $ a = 2, op1 = 2; op2 = $ a ++ => op2 = 2, $ a = 3; 2 + 2 = 4
  • op1 = $ a ++ => op1 = 1, $ a = 2; op2 = ++ $ a => op2 = 3, $ a = 3; 1 + 3 = 4

Откуда взялись эти 5? Или я должен узнать больше о том, как работают операторы?

    Редактировать:

    Я смотрел на раздел « Расширение / Уменьшение операторов », но все еще не мог понять, почему 5.

    ++ $ a: Pre-increment – Увеличивает $ a на единицу, затем возвращает $ a.
    $ a ++: Post-increment – возвращает $ a, а затем увеличивает $ a на единицу.

    Related of "Каким должен быть выход echo ++ $ 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 в сумме операции.