前一阵子一个偶然的机会,在soloist的blog上(http://blog.youkuaiyun.com/soloist)看到一篇关于C/C++中的一个十分历史悠久的问题的讨论,即表达式求值的问题。说实话这个问题着实不新鲜了,被所有论坛提出过无数次,无非就是表达式求值顺序不确定的问题嘛。所以我也就没太在意,soloist那里吵翻了天,说什么的都有,热闹非凡。
当时我就当复习一下,想看看标准对这一块到底有什么明确的说法,就随手翻开了[C++03],结果发现原来情况并非像很多人,乃至我所长期以来认为的那样,简而言之,有下面几个令人意外的结果,不但令我意外,当我把问题发到comp.std.c++新闻组上之后居然引起了一场不大不小的争吵,Andrew Koenig、Herb Sutter、David Abrahams、P.J Plauger...,于是我就看了几天的连台好戏,同时也把这个问题的答案在脑子里刷新了一次。
下面就是两个令人感到意外的现象:
1. 表达式求值并不一定意味着求值过程中的副作用会同步发生!这是一个违反直觉的地方,带来了非常晦涩的语义。