C++自增操作符你真的懂?

  虽然使用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;

本来想说大家自己去试试看哪些操作符是有隔断作用的,但是本人已疯…………

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值