代码一
$m = 0;
$m = $m++;
echo $m;
输出的值是0。代码二
$m = 0;
$k = $m++;
echo $m;
输出的值是1。为什么两段代码最后$m值不同?请高人详细解释一下。
$m = 0;
$m = $m++;
echo $m;
输出的值是0。代码二
$m = 0;
$k = $m++;
echo $m;
输出的值是1。为什么两段代码最后$m值不同?请高人详细解释一下。
调试欢乐多
++$a 前加 $a 的值加一,然后返回 $a。
$a++ 后加 返回 $a,然后将 $a 的值加一。
--$a 前减 $a 的值减一, 然后返回 $a。
$a-- 后减 返回 $a,然后将 $a 的值减一。
$m = 0;
$m = $m++;
echo $m;
输出的值是0。代码二
$m = 0;
$k = $m++;
echo $m;
输出的值是1。
第一个输出0 是因为 先赋值在++
第二个输出1 是因为 你echo的是$m $m在上面自加了 而不是赋值的$K 此时如果输出$k 还是0
xdebug_debug_zval('m');
$m = $m++;
xdebug_debug_zval('m');
echo $m;$m++;
xdebug_debug_zval('m');
echo $m;
m:
(refcount=1, is_ref=0),int 0
m:
(refcount=1, is_ref=0),int 0
0m:
(refcount=1, is_ref=0),int 1
1
涉及到结构体的知识,$m = 0 ; $m++是一个结构体, 赋值给一个变量,那个变量又是一个结构体,
$m++ ,先赋值给那个变量即为0 ,refcount 为指向次数,ref为引用次数,ref=0 不共用一个结构体(参看楼上)
$m++ 是取出 $m 的值,然后 $m 的值加一
也就是 $m = 0 是最后执行的
先赋值,再自增。因为 $m= $m++; 自增的是旧的内存地址。所以新的$m的值是0$k = $m++;
先赋值,再自增。 $k=0; 自增的是旧的内存地址。所以$m的值是1
$a = $m++; // 此步之后$m=1, $a=0
reurn $a; //此步之后$m又被重新赋值了返回的$a
}