$b = $a++;
关键在这里$b=++$a;这样就是你的答案2,2$a++先返回$a的值1然后自加
$b是$a的引用,$b等于1了,$a自然也等于1

解决方案 »

  1.   

    To moodboy1982: 我是说 C 中的指针To eglic: 也就是说,$a 用完了之后不自加了?
      

  2.   

    这个其实是php解释器的问题,它解释的时候执行顺序是首先保存$a的值,然后给$a加一,然后再把先前保存的$a的值赋给$b。就造成了两个都是一了,至于为什么php要按这种执行顺序执行就没有深究过了。
    引用和指针最大的区别就在于指针可以逆解析得到地址,而引用不可以,所以像java就全部是用的引用
      

  3.   

    呵呵,把这个东西由搬到这里来了!手册上说,引用意味着用不同的名字访问同一个变量内容。
    手册上还说,这并不像 C 的指针,替代的是,引用是符号表别名。其实这并没有什么根本的区别。究竟是指向机器指令段的某个地址还是指向符号表的某一项,对于非汇编程序员来讲并不是很重要的。只要知道他真实的指向内存的某个位置就可以了楼主的这个问题,其实应该是php的一个bug递增/递减运算符
    ++$a 前加 $a 的值加一,然后返回 $a。 
    $a++ 后加 返回 $a,然后将 $a 的值加一。 
    --$a 前减 $a 的值减一, 然后返回 $a。 
    $a-- 后减 返回 $a,然后将 $a 的值减一。 于是有
    $a = 1;
    $b = $a++;
    echo "a=$a b=$b";//out a=2 b=1$a = 1;
    $b =& $a;
    $b = ++$a;
    echo "a=$a b=$b"; //out a=2 b=2$a = 1;
    $b =& $a;
    $b = $a;
    $a++;
    echo "a=$a b=$b"; //out a=2 b=2这些符合规则与结果的表述而一个例外
    $a = 1;
    $b =& $a;
    $b = $a++;
    echo "a=$a b=$b"; //out a=1 b=1
    其结果显然是不符合规则的
    其中$b = $a++;实际在做$a++; $b=1;的操作尽管可以从运算符的优先级上讲的通,但是他并不符合“递增/递减运算符”的运算规则
    于是可以说php的开发者们给我们开了一个小“玩笑”,。经测试在php4和php5的各个版本中都存在着这个“问题”既然这种情况出现的可能性极小,在实际应用中回避就是了。或者干脆就不用“递增/递减运算符”
      

  4.   

    不太同意唠叨大哥的意见,$a++应该是先保存$a的值,然后再给$a加一,而不是你说的先返回值再加1。事实上c++的自增操作变成汇编代码后可以很明显的看到是先保存原来的值到寄存器,再把内存里的那个值加1。这也是为什么c++语言里++i要比i++快的原因,因为后者多了一个临时变量来保存值。
    你的原话如下:
    “$a++ 后加 返回 $a,然后将 $a 的值加一。”
      

  5.   

    楼主其实你的理解是没错的,在C++里结果是为2的,为什么PHP却为1呢,这个就要问PHP的开发者啦,也许楼上说的对"这个其实是php解释器的问题,它解释的时候执行顺序是首先保存$a的值,然后给$a加一,然后再把先前保存的$a的值赋给$b",但我更赞同 xuzuning(唠叨)的说法:"他并不符合“递增/递减运算符”的运算规则!"
      

  6.   

    assassin5616 大哥的解释似乎更有道理。解释执行 $b = $a++ 的时候,电脑做了这些事:
    1. 把 $a 的值(为1)存到某个地方
    2. $a 自增 1,值变为 2
    3. 由于 $a 和 $b 指向同一个变量,所以 $b 的值也变成 2
    4. 系统从某个地方把值取(为1)出来,赋给 $b,$b 值为 1
    5. 由于 $a 和 $b 指向同一个变量,所以 $a 的值也变成 1
    这么理解对不对?