Ключевым действующим лицом здесь является приоритет оператора и по этой причине, несмотря на то, что он является последним элементом в выражении, $a++
оценивается first (перед т. Е. $a
). Обратите внимание, что post
в post increment
означает действие после вычисления этого выражения (переменной), а не вычисление всего выражения (строки кода).
В вашем первом случае код такой:
$result = 3 * $a++;
, поэтому значение $a
, используемое для умножения, равно 3
, потому что оно сначала читается, а затем увеличивается. В этом выражении больше не используется $a
, поэтому новое значение $a
на самом деле не имеет значения и не повлияет на нас, если на $a
снова не появится ссылка:
$a = 3
$result = 3 * $a++
= 3 * 3
// $a is 4 now
= 9
Второй случай другой:
$result = $a * $a++;
, поскольку у нас есть несколько ссылок на $a
. Оценка получится следующим образом:
$a = 3
$result = $a * $a++
= $a * 3 // value of `$a` is 4 after post-increment
// evaluation, and this affects us as we
// evaluate $a again
= 4 * 3
= 12
Для полноты ответа давайте добавим еще один случай:
$result = $a++ * $a++;
Оценка будет go аналогично, с другим значением $a
в конец:
$a = 3
$result = $a++ * $a++
// $a is 4 now
= 3 * $a++
= 3 * 4
// $a is 5 now
= 12
Это становится ясно, как только вы понимаете это, но, с другой стороны, наглядно демонстрирует, как легко вы можете перехитрить себя, написав код, который, как вы думаете, вы знаете, как он работает, и как он действительно работает :) Поэтому вам нужно либо внимательно прочитать документацию по языку, чтобы точно знать, какой код вы написали, либо просто избегать написания слишком "умного" кода для личной гигиены во время будущей отладки. сеансы :) KISS принцип существует по причине.