首先先说下原理:
1 printf函数对于括号内的表达式是从右向左执行,如 printf("%d,%d",b++,++b);先执行 ++b,再执行b++;
2对于++a和a++:
++a是先自加,再调用
a++是先调用,再自加
下面来分析下
代码如下
int b=20;
printf("%d,%d",b++,++b);// 21 22printf("%d,%d",b++,b++); //21 20
printf("%d,%d",++b,++b); //22 22
printf("%d,%d",++b,b++); //22 20
首先 第一句(printf("%d,%d",b++,++b);// 21 22就这句)
先执行++b,之后b=21,再执行b++,因为b++是先先调用,在自加,所以先输出b,此时b的值是21,再自加,b=22,此时再输出b,因此输出的结果是21,22
第二句 (printf("%d,%d",b++,b++); //21 20)
先执行b++(第二个b++),因为b++是先调用,后++,所以cpu会记住d的这个printf输出的第二个输出对它的调用(此处第二个输出的值已经确定了)(这儿可能有点难理解,可以这样想,系统缓存了一个b的输出,只是还没输出而已,相当于在此处第二个输出的值就已经确定了,就是b当前的值,即20),之后再执行b++(第一个b++),b还没加的时候是21(执行前面b++得到的结果),同样,b++是先调用,再执行,因此就输出了21,第二个输出20是前面系统对它算是记忆吧,因此输出20,如果在这句后面加上printf("%d",b);的话,这句输出的b的值是22
第三句一样的道理, 先执行++b,因为++b先自加,再调用,而此时cpu并没有到调用它的时候,printf第二个格式化的值对应的数字现在还不确定,在然后执行++b,同样先自加,再调用,输出22,接着再输出第二个,因为cpu没有记住对第二的调用,他会找当前b的值,当前b的值是22,所以输出22,22
最后一句,一样的道理,这儿我就不分析了。