https://mp.weixin.qq.com/s/AEuzI-OpWj9hmQCN6pCB9A
转载自微信公众号【编程珠玑】
#include <stdio.h>
int main(void)
{
int i = 4;
printf("%d\n%d\n%d\n%d\n",i,i+1,i++,i);
return 0;
}
乍一看不就是输出
4
5
4
5
么,但在有的环境(我这里macOS10.15.6+clang 12.0.0,会提示警告,但还是会输出上面结果)是会输出
5
6
4
5
这是因为,通常来说(不是绝对),参数是按照从右往左顺序计算,然后压入栈帧,也就是说,对iostream类"可调用"实例对象cout而言,传参是从右到左的:
i ,该位置参数值为i的值
i++,后置自增,先用再增,即得到4,该位置参数值为4,而i变为5
i+1,此时值为5+1=6,得到6,该位置参数值为6,i的值本身不变,即还是5
i,该位置参数值为i的值,即5。
因此,参数i的地方都为5,其他两个位置分别为6和4。
注意,这里i的值最终变为了5。
因此,从左到有,输出的值分别为5,6,4,5