首先是一段代码:
1 int a = 3; 2 printf("%d %d\n",a++,++a); 3 a = 3; 4 printf("%d %d\n",++a,a++");
输出分别是45和53。
原因是当函数传进来的不是变量而是一个表达式的时候,要先对表达式求值,求值的顺序是从右往左,于是第一条cout语句的步骤如下:
(1)先执行++a,a = 4,前置++返回对a的引用,将a的引用压入栈中;
(2)执行a++,将表达式的值4压入栈中,此时a=5,因为之前压入栈中的是a的引用,所以相应的栈中的值变为5;
(3)栈中的结果出栈,所以输出45.
同理,第二条cout语句也类似,但由于是先执行a++,后置++返回的仅仅是a的值,所以在执行++a后虽然a的值改变了,但栈中的第一个值不改变。