一道阿里面试题
int main(){
int i = 1;
printf("%d, %d\n", ++i, ++i);
printf("%d, %d\n", ++i, i++);
/*cout << ++i <<" "<< ++i << endl;
cout << ++i << " " << i++ << endl;*/
return 0;
}
输出结果
3 3
5 3
两个要点:
- printf的操作是从右到左计算表达式的值,将返回值(地址)存入相应的缓存区。表达式计算完毕后,将所有缓存区按计算顺序入栈,依次弹栈输出。
- 对于返回值,前置++i返回的是i变量本身的地址,而后置i++返回的是临时缓存区的地址(我们知道i++是先返回i再+1)
问题本身:
-
printf("%d, %d\n", ++i, ++i);
两个++i依次计算后,由于printf缓存区里存的就是i本身的地址,因此输出的就是i的最终值3。 -
printf("%d, %d\n", ++i, i++);
先计算i++:开辟临时地址,存入加之前的值3,将该地址存入缓存区;
再计算++i:将i的地址存入缓存区,此时i是5。
参考
此博客参考牛客网牛友的回答