背景介绍
关于前置自增、后置自增的介绍文章已经很多了。例如:C++ 递增运算符:前置++和后置++的区别(读者可以自行搜索其他文章)。
可以得出的一个结论是前置版本将对象本身作为左值返回,后置版本则将原始对象的副本作为右值返回。
因此像下面这段代码,将会输出:2, 1, 3。
int mian() {
int i, j, k;
i = 0;
j = 1;
k = 2;
k += (i++) + j; // k = 3;
printf("%d, %d, %d", ++i, j--, k);
}
printf打印
考虑下面这段代码:
int mian() {
int i = 0;
printf("%d, %d, %d, %d", ++i, i++, --i, i++);
}
一种自然的想法是输出的结果应该是:1, 1, 1, 1。然而编译后实际输出却是:2, 0, 2, 0。实际上,printf在打印之前把需打印的值推入栈中,最终将打印结果出栈。也就是实际流程是:
也就是说前置的自增(或自减)最终打印的都是i最终的值,也就是2,而后置的自增(或自减)打印的则为从右往左进行计算时,i自增(或自减)之前的值。