++a和a++专题 (转自suningin)

这个方向的题目一直是我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

原文地址:https://www.cnblogs.com/smileallen/p/3391594.html