Почему $ x = 5; $x+++ $ х ++; равна 11 в PHP?
Согласно опкодам, это должно быть 12. Я ошибаюсь?
number of ops: 8
compiled vars: !0 = $x
line #* E I O op fetch ext return operands
-------------------------------------------------------------------------
3 0 E > EXT_STMT
1 ASSIGN !0, 5
5 2 EXT_STMT
3 POST_INC ~2 !0
4 POST_INC ~3 !0
5 ADD ~4 ~2, ~3
6 ECHO ~4
7 7 > RETURN 1
branch: # 0; line: 3- 7; sop: 0; eop: 7; out1: -2
path #1: 0,
редактировать
Также ($x++) + ($x++); возвращает тот же результат (11). На самом деле это была основная причина исследования вопросов и операций.
Ответы
Ответ 1
Мне потребовалось несколько чтений, но $x=5; $x++ + $x++;
$x=5; $x++ + $x++;
работает так:
В случае $x++ он сначала "привыкает", а затем увеличивается:
- Установите $ x на 5
- Поместите $ x в стек (то есть 5)
- Инкремент (
++
) ($ x теперь равен 6) - Добавьте $ x в стек (который добавляет 6, поэтому 5 + 6 → $ x = 11)
- Добавление сделано, что результат 11
- Инкремент $ x (
++
) (который больше не используется, но $ x теперь равен 7)
На самом деле, в этом конкретном примере, если бы вы echo $x;
он вывел бы 7. Вы никогда не переназначаете значение обратно в $ x, поэтому $ x = 7 (вы увеличили его дважды);
Ответ 2
$x = 5;
$a = $x++ + $x++;
строка выражения будет выполнена следующим образом: 1-е вхождение $x++
в выражении будет увеличивать значение $x
на 1, поэтому оно станет 6 и
во втором вхождении значение $x
будет иметь значение 6;
Итак, $ a = 5 + 6;
Таким образом, конечный результат $a
будет равен 11.
Ответ 3
++ имеет более высокий приоритет, чем + оператор
(x++) вернет значение x сначала, а затем увеличит его на 1
$x = 2
$x++ // return 2, then increment it to 3
x++ + x++ оценивается следующим образом:
1. Get x value first which is 5
2. Then it will be incremented to 6
3. But first x value will be 5 because (x++) statement will return 5 first then increment the value
4. Then + operator is encountered
5. Next x will have 6 as value not 7 for the same reason (x++) will return the x value first and then increment it
6. So 5+6 is 11
7..At the end, x value will be 7
То же самое касается ($x++)+($x++)
grouping operator()
имеет left to right
. Сначала выполняется ($x++)
.
$x = 5
($x++) returns 5 and then increment $x by 1. Same as before.
затем выполняется последний ($ x++). Он возвращает 6, а затем увеличивает $ x до 7
так что возвращается 5+6//11
назад
Ответ 4
Оператор приращения post увеличивает эту переменную, но возвращает ее старое значение.
Таким образом, $x++
эквивалентен:
($temp = $x, $x = $x + 1, $temp)
Когда вы делаете это дважды в выражении, это выглядит так:
echo ($temp1 = $x, $x = $x + 1, $temp1) + ($temp2 = $x, $x = $x + 1, $temp2);
Первая часть устанавливает $temp1 = 5
и увеличивает $x
до 6
.
Вторая часть устанавливает $temp2 = 6
и увеличивает $x
до 7.
Затем он $temp1 + $temp2
и повторяет результат, который равен 5 + 6 = 11
.
Ответ 5
Вы используете оператор post-increment ($x++). Если вы хотите использовать добавочное значение для добавления, вы должны использовать оператор pre-increment (++$x).
Поэтому, если $ x = 5
$x++ + $x++ equals 5+6 = 11
++$x + $x++ equals 6+6 = 12
$x++ + ++$x equals 5+7 = 12
$++x + ++$x equals 6+7 = 13
Но во всех случаях х равно 7.
Ответ 6
$x = 5;
echo $x++ + $x++;
печатает 11, поскольку сначала $x++ возвращает 5, а затем после этого увеличивается, второй $x++ возвращает 6 и единственное значение в увеличении. поэтому фактическое добавление составляет 5 + 6, что дает 11.
Ответ 7
++$x + $x++ будет 12
И ++$x + ++$x будет 13
когда вы используете $x++ $ x, получите +1, как только это значение будет использоваться, но значение, которое будет использоваться, - это значение, которое оно имеет до приращения, поэтому, когда вы делаете:
$ Х = 5; $x+ ++$x ++;
$x+ ++$x ++ - 11, но $ x будет 7