• 表达式之运算顺序与求值顺序

    • C/C++中的情况

    写这篇水文的缘由是技术群里的一个同学提出的问题,可能是什么笔试题目吧!内容很简单,求表达式(++a) + (++a) + (a++)的值,其中a=5。对于这个问题,估计大部分同学都会给出20这个答案,我也是这么想的。在Java中,这个表达式的答案也确实是20。可惜这个题目的背景是C/C++,问题好像不是那么简单了,VC6给出的答案是22。开始我没有仔细算,猜测是C/C++在处理算术表达式的时候使用了某种自顶向下的文法。为了消除左递归,表达式求值的时候是按照从右到左的顺序处理的。但是,这样也不能解释VC6给出的答案,这种求值顺序的答案应该是21才对。

    理论分析吃瘪,我决定还是看看汇编吧!我先在GCC下做了个简单的实验,结果是21。反汇编的结果如下:

    image

    乍一看结果21,可能有人会认为这个结果的计算过程是6 + 7 + 8。到底是什么样,看汇编便知… 【查看更多】