Почему 1 уменьшение значения 1 = 2?

#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;