i++的几个问题,你注意了吗?

(1)x=x+1,x+=1,x++,哪个效率最高?为什么?

x=x+1最低,它的执行过程如下:

读取右x的地址;x+1;读取左x的地址;将右值传给左边的x(编译器并不认为左右x的地址相同)。

x+=1执行过程如下:

读取地址;x+1;将得到的值传给x。

x++效率最高,执行过程如下:

读取x的地址;x自增1。

但是看到这个题目,起初我觉得应该是一样的,难道所有的编译器都如上实现吗?

(2)What will be the output of the following C code?

#define product(x) (x*x)

int main()

{

  int i=3,j,k;

  j=product(i++);

  k=product(++i);

  printf("j=%d,k=%d",j,k);

  return 0;

}

解析:product(i++)=i++*i++; i等于3,所以j等于9,此时i已经累积为5。

   product(++i)要求先累加i,累加后i等于7,所以product(++i)的结果为49。

我犯了这样的错误:认为i++*i++,在第一部分取完i的值3后,经过i++之后i的值变为4,故j的值等于12,i变为5。

         同样的道理++i*++i,++i先自增后,i的值变为6,然后再自增i的值变为7,k的值等于42。

正解应该是:乘法运算先把参与乘法运算的两个数取出来,执行乘法后,再执行两个自增的运算。

后者则是先执行自增的运算,再执行乘法的运算。故j=9;k=49。

总结:这些笔试题初看起来都不是太难,但是做起来还是心里挺打哆嗦的,没怎么抠过这些细节,我认识到自己不是一个合格的程序员,继续修炼。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值