#php #operators
#php #операторы
Вопрос:
Я нашел фрагмент кода (от одного из наших разработчиков), и мне было интересно, почему результат этого равен 2?
<?php
$a = 1;
$a = $a-- 1;
echo $a;
Спасибо
Комментарии:
1. Не могли бы вы, пожалуйста, изложить код разумным образом?
2. могу ли я увидеть 2 строки выше и ниже этой строки? 🙂
3. Можете ли вы показать этот фрагмент кода?
Ответ №1:
Я дам свое объяснение вихрю. Мы говорим о переменной, ссылающейся на некоторое значение, отключенное в системе.
Итак, когда вы определяете $a = 1
, вы указываете переменной $a
значение 1
, которое где-то отсутствует в памяти.
Со второй строкой вы делаете $a = $a-- 1
так, что создаете новое значение и устанавливаете $a
его равным . $a--
Извлекает значение оригинала $a
, которое 1
и добавляет 1
в make 2
, и создает это значение где-то еще в памяти. Итак, теперь у вас есть переменная $a
, которая указывает на 2
и какое-то другое значение 1
в памяти, которое по пути уменьшилось до 0
, но на него больше ничего не указывает, так что кого это волнует.
Затем вы повторяете $a
, что указывает на ваше значение 2
.
Редактировать: страница тестирования
Комментарии:
1. Спасибо за объяснение, теперь я понял
2. это я или это глупо делать так (я имею в виду программу таким образом), используя $a— 1?
3. @Pat R Ellery: Не обязательно, если другая переменная имеет ссылку на то же местоположение, то эта переменная все равно будет указывать на уменьшенное значение. В данном конкретном случае
--
это бесполезно.
Ответ №2:
$a— уменьшает значение после выполнения строки. Чтобы получить ответ 1, вы должны изменить его на —$a
<?php
$a = 1;
$a = --$a 1; // Decrement line
echo $a;
?>
Комментарии:
1. итак, если $ a— уменьшается после строки, в echo $ a это будет $ a = 2; тогда $ a = 1 ($ a—) тогда это echo $ a, что равно 1 no?
2. @James: -1.
$a--
не уменьшает значение после выполнения строки, оно уменьшает его до появления 1 . Однако выражение вычисляется до исходного значения$a
перед уменьшением, что объясняет такое поведение.3. При выполнении постепенного уменьшения или увеличения. Он не будет устанавливать приращение, если оно находится после переменной и оно устанавливается само (в уравнении). Чтобы включить его в уравнение (для уменьшения во время), вы добавляете часть приращения перед переменной.
4. @robjb я просто добавил это в комментарий одновременно. Я понял, что после того, как написал это, это не имело смысла.
5. Хорошо, я в принципе знаю, почему это работает, но после прочтения всех объяснений, я думаю, было бы здорово, если бы кто-нибудь действительно проанализировал фактическую строку
$a = $a-- 1
и объяснил, что на самом деле делает интерпретатор php 😉
Ответ №3:
Что за?
Просто чтобы уточнить другие ответы, что у вас происходит в этой строке:
$a = $a-- 1;
По сути, когда PHP вычисляет $a—, он фактически возвращает значение $ a, а затем выполняет операцию его уменьшения.
Попробуйте это
$a = 1;
echo $a--; //outputs 1;
echo $a; //outputs 0;
Когда вы запустите этот код, вы увидите, что число уменьшается только после того, как оно было возвращено. Итак, используя эту логику, становится немного понятнее, почему
echo $a-- 1;
выводил бы 2 вместо 1.
Лучший способ
Возможно, лучший способ, возможно, более понятный, был бы
$a = $a -1 1
Ответ №4:
$a = 1; /* $a is 1 */
$a = ($a--) /* returns 1 and decrements the copy of $a */ 1 /* 1 1 = 2 */;
echo $a; /* 2 */
Вышесказанное эквивалентно чему-то вроде:
$a = 1; /* $a is 1 */
$temp = $a 1; /* 1 ($a) 1 = 2 */
$a = $a - 1; /* decrements $a */
$a = $temp; /* assigns the result of the above operation to $a */
echo $a;
На самом деле это в значительной степени то, во что PHP переводит это за кулисами. So $a--
не такая полезная операция, поскольку $a
она все равно будет перезаписана. Лучше просто заменить это на $a - 1
, чтобы сделать его более понятным и исключить дополнительную операцию.
Комментарии:
1. Я думаю, что это было бы на самом деле
$temp = $a;
, тогда$a = $a - 1;
и$a = $temp 1;