为什么1 +递减值+ 1 = 2?

时间:2011-10-16 23:17:20

标签: php operators

我发现了一段代码(来自我们的一位开发人员),我想知道为什么输出为2?

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

感谢

4 个答案:

答案 0 :(得分:22)

我会给我的解释一个旋转。我们讨论的是一个变量引用系统中的某些值。

因此,当您定义$a = 1时,您将变量$a指向值1,该值在内存中已关闭。

使用第二行,您正在执行$a = $a-- + 1,因此您创建新值并将其设置为$a$a--检索原始$a的值,1并添加1以生成2,并在内存中的其他位置创建该值。所以现在你有一个变量$a指向2和其他一些值1关闭内存,一路上递减到0,但没有任何东西指向它了,所以谁在乎。

然后,您回显$a,它指向您2的值。

修改:Testing Page

答案 1 :(得分:20)

$ a--在行执行后递减值。要获得1的答案,您可以将其更改为 - $ a

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

答案 2 :(得分:12)

是什么?

只是为了澄清其他答案,你在这一行中发生了什么:

 $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

答案 3 :(得分:9)

$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替换它,以使其更清晰并消除额外的操作。