生活总不如人内心想象的容易,需要一个探索的过程。
好了话不多说,先看下面一段代码.
int i = 0;
printf("%d %d %d",i,i++,++i);
我们可以知道printf函数参数是从右向左遍历
第一个前置++是先自增再使用,应该打印出1
第二个i++是先使用再自增,应该打印出0
第三个打印i,应该是0
我们跑一下代码看看结果
结果是2,1,2,与我们想象的太不一样了。这是为什么呢?
看一下反汇编的结果
可能很多小伙伴不懂,用通俗的语言来分析这种结果,我上网查了一下资料,在vs2019里面printf函数确实是从右向左遍历参数,但从右向左遍历时不是遍历一次就打印一个参数,而是走完整个过程,统一打印最后一个值。
其中有一个特殊的运算符号,后置++,对于后置++来说,他最终不会返回整体统一返回的值,只会返回当时算到这一步时i对应的初始值。下边来逐语句分析一下。
1:设定i = 0;
2:++i,此时遍历第一个参数时,i->1
3:i++, 从第二步到第三步开始时候,i传过去的参数是2,最后这一步不会受到整体返回的影响,只会打印这个初始值1,但是i++仍旧要计算,此时i等于2
4:i,第三步传给第四部的值是3,到此所有参数遍历完毕,最后每一步都应该返回3,但是后置++不受整体返回的影响。所以最后打印的结果为2,1,2
不妨再来个长一点的代码分析一下
int i = 1;
printf("%d,%d,%d,%d,%d,%d,%d",i,i++,++i,i++,++i,i++,++i)
1:++i, i->2
2:i++, i->3,打印2
3:++i, i->4
4:i++, i->5,打印4
5:++i, i->6
6:i++, i->7,打印6
7:i,i = 7, 到此遍历结束,应该所有除了后置++的统一返回7
8:打印结果应该是7,6,7,4,7,2,7
跑一下代码试试
果然如此。对此大家应该对此过程有一定的程度的掌握了,总之要记住的就是从右向左遍历完每一个参数后再统一返回,后置++不会受到统一返回的影响。