去学习了一下,来献个丑:
两个要点:
1. printf的操作是从右到左计算表达式的值,将返回值(地址)存入相应的缓存区。表达式计算完毕后,将所有缓存区按计算顺序入栈,依次弹栈输出。
2. 对于返回值,前置++i返回的是i变量本身的地址,而后置i++返回的是临时缓存区的地址(我们知道i++是先返回i再+1)

问题本身:
1. printf("%d, %d\n", ++i, ++i);
两个++i依次计算后,由于printf缓存区里存的就是i本身的地址,因此输出的就是i的最终值3。

2. printf("%d, %d\n", ++i, i++);
先计算i++:开辟临时地址,存入加之前的值3,将该地址存入缓存区;
再计算++i:将i的地址存入缓存区,此时i是5。