V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
sujin190
V2EX  ›  问与答

好奇怪的 php 计算结果

  •  
  •   sujin190 · 2014-07-15 13:21:30 +08:00 · 3416 次点击
    这是一个创建于 3790 天前的主题,其中的信息可能已经有所发展或是发生改变。
    $a=2;$b=&$a;echo (++$a)+($a++);
    $a=2;$b=$a;echo (++$a)+($a++);

    为什么上面是7下面是6呢?
    18 条回复    2014-07-15 21:17:38 +08:00
    0xef
        1
    0xef  
       2014-07-15 13:25:33 +08:00
    AlanZhang
        2
    AlanZhang  
       2014-07-15 13:28:05 +08:00
    @0xef 明明是6,怎么是7呢。
    sujin190
        3
    sujin190  
    OP
       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
        4
    lizheming  
       2014-07-15 13:30:26 +08:00
    zakokun
        5
    zakokun  
       2014-07-15 13:39:52 +08:00   ❤️ 1
    纠结这种问题的人都....算了不说了
    0xef
        6
    0xef  
       2014-07-15 13:49:25 +08:00   ❤️ 1
    我猜测是之前有个Bug

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

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

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

    恩,php开发者nikic在reddit上也是这样说过,不保证顺序.
    zaishanfeng2014
        15
    zaishanfeng2014  
       2014-07-15 16:21:58 +08:00
    最恨面试出这种题目的sb公司,遇到这样的躲得越远越好
    sujin190
        16
    sujin190  
    OP
       2014-07-15 16:32:31 +08:00
    sujin190
        17
    sujin190  
    OP
       2014-07-15 16:33:52 +08:00
    @66450146
    @kankana
    @lincanbin
    嗯,这个只是无意中看到的,以前记得有人说过这事,只是一下子忘掉了,有点奇怪,不过确实不应该这么写
    usedname
        18
    usedname  
       2014-07-15 21:17:38 +08:00
    这样有意义么?有使用价值么?真的看到就烦
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1257 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:12 · PVG 02:12 · LAX 10:12 · JFK 13:12
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.