Подтвердить что ты не робот

Почему 1 + декрементирование значения + 1 = 2?

Я нашел фрагмент кода (от одного из наших разработчиков), и мне было интересно, почему его вывод равен 2?

<?php
  $a = 1;
  $a = $a-- +1;
  echo $a;

спасибо

4b9b3361

Ответ 1

Я объясню свое объяснение вихрем. Мы говорим о переменной, ссылающейся на некоторое значение в системе.

Итак, когда вы определяете $a = 1, вы указываете переменную $a на значение 1, которое где-то в памяти.

Во второй строке вы делаете $a = $a-- + 1, чтобы создать новое значение и установить значение $a. $a-- извлекает значение исходного $a, которое 1 и добавляет 1, чтобы сделать 2 и создает это значение где-то еще в памяти. Итак, теперь у вас есть переменная $a, которая указывает на 2 и какое-то другое значение 1 в памяти, которая по порядку уменьшена до 0, но ничего не указывает на нее больше, поэтому кому это нужно.

Затем вы эхо $a, который указывает на ваше значение 2.

Изменить: Страница тестирования

Ответ 2

$a-- уменьшает значение после выполнения строки. Чтобы получить ответ 1, вы измените его на - $a

<?php
 $a = 1;
 $a = --$a +1; // Decrement line
 echo $a;
?>

Ответ 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 переводит, что за кулисами. Таким образом, $a-- не является такой полезной операцией, так как $a все равно будет перезаписана. Лучше просто замените это на $a - 1, чтобы сделать его более ясным и устранить дополнительную операцию.