谁给讲讲引用与指针的区别?

nowgoo 2005-12-06 01:15:59
有这么一道题:
$a = 1;
$b =& $a;
$b = $a++;
问,现在$a和$b各是多少?我想都没想就答了2,2
答案是1,1

手册上说,引用意味着用不同的名字访问同一个变量内容。我的疑问是,$a 把值1赋给 $b 以后再自增1,$b 应该也加1啊……谁给开导一下,谢了
...全文
153 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
jiayishuai 2005-12-06
  • 打赏
  • 举报
回复
今天算是明白了,以前也是较困惑阿
nowgoo 2005-12-06
  • 打赏
  • 举报
回复
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
这么理解对不对?
leakey8 2005-12-06
  • 打赏
  • 举报
回复
楼主其实你的理解是没错的,在C++里结果是为2的,为什么PHP却为1呢,这个就要问PHP的开发者啦,也许楼上说的对"这个其实是php解释器的问题,它解释的时候执行顺序是首先保存$a的值,然后给$a加一,然后再把先前保存的$a的值赋给$b",但我更赞同 xuzuning(唠叨)的说法:"他并不符合“递增/递减运算符”的运算规则!"
xuzuning 2005-12-06
  • 打赏
  • 举报
回复
小哥哥,那不是我说的,是手册上说的。
assassin5616 2005-12-06
  • 打赏
  • 举报
回复
不太同意唠叨大哥的意见,$a++应该是先保存$a的值,然后再给$a加一,而不是你说的先返回值再加1。事实上c++的自增操作变成汇编代码后可以很明显的看到是先保存原来的值到寄存器,再把内存里的那个值加1。这也是为什么c++语言里++i要比i++快的原因,因为后者多了一个临时变量来保存值。
你的原话如下:
“$a++ 后加 返回 $a,然后将 $a 的值加一。”
assassin5616 2005-12-06
  • 打赏
  • 举报
回复
补充一下,这应该就是通行的自右及左的计算方式,应该主流的编译器和解释器都是这么干的
xuzuning 2005-12-06
  • 打赏
  • 举报
回复
呵呵,把这个东西由搬到这里来了!

手册上说,引用意味着用不同的名字访问同一个变量内容。
手册上还说,这并不像 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的各个版本中都存在着这个“问题”

既然这种情况出现的可能性极小,在实际应用中回避就是了。或者干脆就不用“递增/递减运算符”

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

To eglic: 也就是说,$a 用完了之后不自加了?
moodboy1982 2005-12-06
  • 打赏
  • 举报
回复
PHP什么时候有指针了?
是是非非 2005-12-06
  • 打赏
  • 举报
回复
$b = $a++;
关键在这里

$b=++$a;这样就是你的答案2,2

$a++先返回$a的值1然后自加
$b是$a的引用,$b等于1了,$a自然也等于1

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧