这个方向的题目一直是我suningin个人的一块心病,知道好久了,但是从来没有安心下来彻底研究研究,今天晚上用了些时间终于给弄了出来,放在这里和大家分享,呵呵。。。
大家先来看看下面计算式子的值,试试自己来做做
int b=0,c=0,d=0,g=0,i=0;
int a=1,e=1,f=1,h=1,j=1;
i = (++j) + (j++) + (j++);
g = (h++) + (h++) + (++h);
b = (a++) + (a++) + (a++);
c = (e++) + (++e) + (e++);
d = (++f) + (++f) + (++f);
你的结果是什么?
============================
==
==
==
==
==
==
============================
如果是 6,4,3,6,10的话那么你就不用再往下看了,这道题目不会是你笔试的障碍。。。
如果不是,那么suningin详解系列将为你解决!
首先我们来分析一下加法的预算符“+”在c中它的是双目运算符结合方向是自左向右。也就是说要至少有两个变量才起作用,它们的结合顺序是从左到右。用 A+B+C来说明,如果要得到表达式的结果,就要从左到右执行表达式,先运算左边的+,再运算右边的+。第一个+要执行,就要先确定A,再确定B,然后才相加得到结果;用这个结果作为第二个+的左值,然后确定c,然后相加得到最后的结果。
分步骤来表述上面的过程:拿 c = (e++) + (++e) + (e++)为例子
1。确定第一个+左值A:(e++)为1;
2。确定第一个+右值B:(++e)为2,因为得到的数字都是存储在变量e这个存储空间中,这时A也变为2;
3。确定第二个+左值A+B:(e++) + (++e)为4;
4。确定第二个+右值C:(e++)因为这个(e++)还是从变量e存储空间中取值,所以C为2;
5。确定最后的值:(e++) + (++e) + (e++)为4+2,最后为6。
同理大家可以自己再来计算一下其他表达式的值,看看这回的结果是否正确。这里要强的一点就是如e++这里的++的执行时间式是:当整个表达式结束的时候,也就是当c=(e++)+(++e)+(e
++)已经得到c=6;后才执行,也就是当开始计算d=(++f)+(++f)+(++f);时候这时e=4。
如果大家已经理解了这个算法我们来做个联系看看suningin的讲解你有没有学会,呵呵..
int a=1,b=0;
b = (a++)+(++a)+(a++)+(++a);
int a =1, b =0;
b = (++a)+(++a)+(++a)+(a++);
====================================
==
==
==
==
==
===
===
===
===
====
====
====
====
==================================
答案分别是:(2+2+2+3)=9,(3+3+4+4)=14。怎么样你做对了么。。。
我们再来一道:
int a =1, b =0;
b = (a++)+(++a)+(++a)+(a++);
==================================
==
==
==================================
没错是(2+2+3+3)=10。。。。
在找资料中无意看到他的blog,发现好东西不少。当然这道题目似乎还有点争议,可能是编译器的问题吧
suningin的blog是http://hi.baidu.com/suningin