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