虽然使用C++已经长达五年之久,但是对于C++的这个++却实在是一知半解。说来惭愧。 相信所有学过C++的人都知道++C于C++在运算符产生的效果上的异同。那么当一个表达式或者一个语句中出现两次同样的++会是什么样的表现呢?
例如int a=2; int b=(a++)*(a++)等于多少呢? 是4还是6还是8?
最简洁快速的办法就是写代码,让编译器告诉我们答案。于是构造了这么一段代码:
int _tmain(int argc, _TCHAR* argv[])
{
int a,b;
a = 2; b = 3;
int a1 = (a++)*(a++);
a = 2; b = 3;
int a2 = (++b)*(++b);
a = 2; b = 3;
int b1 = a++<<a++;
a = 2; b = 3;
int b2 = ++a<<++a;
a = 2; b = 3;
int c1 = (a++*b++,a++*b++);
a = 2; b = 3;
int c2 = (++a*++b,++a*++b);
a = 2; b = 3;
int d1 = (a++,++b)<<(a++,++b);
a = 2; b = 3;
int d2 = (a++,b++)<<(++a,++b);
a = 2; b = 3;
int d3 = (a++,b++)<<(++b,++a);
a = 2; b = 3;
int d4 = (b++,a++)<<(++a,++b);
printf("\na1:%d",a1);
printf("\na2:%d",a2);
printf("\nb1:%d",b1);
printf("\nb2:%d",b2);
printf("\nc1:%d",c1);
printf("\nc2:%d",c2);
printf("\nd1:%d",d1);
printf("\nd2:%d",d2);
printf("\nd3:%d",d3);
printf("\nd4:%d",d4);
return 0;
}
得到的输出是:
a1:4
a2:25
b1:8
b2:64
c1:12
c2:20
d1:160
d2:64
d3:64
d4:96
那么说明了什么?我大致总结了一下,在一个不具有“隔断”作用的操作符隔断的情况下,a++这种后加加运算会一直推后执行,待表达式计算完成,变量才集中自增。所以a1的计算中,a以2代入计算,2*2=4后,a自增到4;同理a2的计算,b先连续自增两次,然后代入表达式计算得到5*5=25 。 b1和b2的结果表明,移位操作符也没有隔断作用,b1=2<<2;b2=4<<4。c1和c2的结果表明,逗号操作符是有隔断作用的,逗号左边要独立计算完毕自增完毕才会计算右边。c1=(2*3,3*4);c2=(3*4,4*5); 那么现在可以推断d1d2d3的计算结果了:
d1中a是干扰考虑移位不是隔断操作符故d1=5<<5=160;
d2中a是干扰考虑移位<<是不隔断的d2=4<<4;
d3中首先a++遇到逗号隔断a自增为3,b++和不隔断的移位后的++b使得b先自增一次的移位左侧b取4;移位右边值为3的a自增先则取4代入,于是得到4<<4=64;
d4同理d3,只是值不同,d4=3<<5=96;
本来想说大家自己去试试看哪些操作符是有隔断作用的,但是本人已疯…………