正确答案应该是:没有正确答案。根据编译器的不同,有不同结果。
解释:参考Bjarne Stroustrup 《C++程序设计语言》(特别版)(裘宗燕 译)P110中的第6.2.2节,关于表达式的求值顺序的说明。
原文:
在一个表达式里,子表达式的求值顺序是没有定义的。特别是,你不能假定表达式从左到右求值。不对表达式的求值顺序加以限制,使得具体实现中有可能生成更好的代码。(注:这就是所谓的编译器优化)
例如:
int i = 1;
v[i] = i++;
这可能求值出v[1] = 1或者v[2] = 1,也可能导致更奇怪的行为。
到这里,解释的已经够清楚了。如果对j = --i + i++;按从左到右求值,那么结果将是8(4+4),若按从右向左,结果将会是9 (4+5),但如果结果是10,也不必感到惊讶。
大家可能许多人当初看谭版的C,不应该忘记一个曾经让人吃惊的例子:
i=3; (++i)+(++i)+(++i)结果是多少?18!
i=3; (i++)+(i++)+(i++)结果是多少?9!
据说是在MS C和Turbo C的结果。实验了下,TC2.0上果然是。但是,在gcc version 4.1.2 (Ubuntu 4.1.2-0ubuntu4,结果是16,9。而(++i)+(++i)+(++i)+(++i)的结果是23......天!
BTW:若对于
![](https://i-blog.csdnimg.cn/blog_migrate/6810355c2f78c12e91b7997a8e8c583a.gif)
词法分析将得到j = i-- ++ + i;(贪婪规则)
对其编译将会出现编译错误。。。
对于(i--)++,i--不是一个左值(它不是一个存放在x里面的值),不能对其进行++操作
而若换成(--i)++,则是没问题的