好奇怪的 php 计算结果

2014-07-15 13:21:30 +08:00
 sujin190
$a=2;$b=&$a;echo (++$a)+($a++);
$a=2;$b=$a;echo (++$a)+($a++);

为什么上面是7下面是6呢?
3404 次点击
所在节点    问与答
18 条回复
0xef
2014-07-15 13:25:33 +08:00
AlanZhang
2014-07-15 13:28:05 +08:00
@0xef 明明是6,怎么是7呢。
sujin190
2014-07-15 13:28:56 +08:00
@0xef

C:\Users\su>php --version
PHP 5.4.16 (cli) (built: Jun 6 2013 17:02:22)

C:\Users\su>php -r "$a=2;$b=&$a;echo (++$a)+($a++);"
7

C:\Users\su>php -r "$a=2;$b=$a;echo (++$a)+($a++);"
6

这有是怎么回事呢?有点不合常理嘛
lizheming
2014-07-15 13:30:26 +08:00
zakokun
2014-07-15 13:39:52 +08:00
纠结这种问题的人都....算了不说了
0xef
2014-07-15 13:49:25 +08:00
我猜测是之前有个Bug

在内部处理的时候,当一个变量有两个或者更多ref count的时候,一个表达式里的(++$a)会被立即返回,而不是存储到一个新的临时变量里以完成最终的表达式计算
churchmice
2014-07-15 14:41:00 +08:00
我只能说谭浩强的书看多了吧,能写出这种代码的我非打他一顿
dndx
2014-07-15 14:45:32 +08:00
没事找事,好好的代码不写非写这种蛋疼代码。
66450146
2014-07-15 14:51:48 +08:00
敢把这样的代码传到我的 repo 里面的我非得揍他一顿

一个表达式里面多次存取一个变量的行为本来就是无法预期的。把产品建立在无法预期的东西的基础上,你猜老板会怎么想?
jyhmijack
2014-07-15 14:54:51 +08:00
lygmqkl
2014-07-15 14:59:58 +08:00
代码写成这样我只想说,zuo的节奏,没必要。在大公司会被警告的。
lincanbin
2014-07-15 15:09:45 +08:00
http://zh.wikipedia.org/wiki/%E6%9C%AA%E5%AE%9A%E4%B9%89%E8%A1%8C%E4%B8%BA
未定义行为在任何语言中都应该避免,不止是C。
哪怕PHP的解释器只有官方那一种,也不能这样做,会被队友打死的。
66450146
2014-07-15 15:16:26 +08:00
@sujin190 这个很正常,一点也不会“不合常理”

@0xef 这不是一个 bug,因为根本就没有“正确的行为”
kankana
2014-07-15 16:09:31 +08:00
@66450146

恩,php开发者nikic在reddit上也是这样说过,不保证顺序.
zaishanfeng2014
2014-07-15 16:21:58 +08:00
最恨面试出这种题目的sb公司,遇到这样的躲得越远越好
sujin190
2014-07-15 16:32:31 +08:00
sujin190
2014-07-15 16:33:52 +08:00
@66450146
@kankana
@lincanbin
嗯,这个只是无意中看到的,以前记得有人说过这事,只是一下子忘掉了,有点奇怪,不过确实不应该这么写
usedname
2014-07-15 21:17:38 +08:00
这样有意义么?有使用价值么?真的看到就烦

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/122712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX