C++

来源:互联网 发布:java考试题 编辑:程序博客网 时间:2024/06/04 19:07

++的故事

     i++与++i的区别:i++是先令i参加其它运算,然后再令i加1;而++i是先令i加1,然后再令i参加其它运算。--同++
i=2,j=3;

(i++)+(++j),--j*5+(!j==!i),(++i==j)*++j,!i++*8
对(i++)+(++j):相当于2+4=6
上式运算完后i变为3,j变为4。

对--j*5+(!j==!i):--j*5相当于3*5=15,此时j变为3,i也为3,(!j==!i)是一个逻辑表达式,其值只能是0(false)或1(true),其中只要j不为0,则!j等于0,而0==0显然是1(true),即整个式子相当于3*5+1=16

对于(++i==j)*++j:(++i==j)相当于(4==3)其值为0,整个式子相当于0*4=0
上式完后i,j都变为4

对于!i++*8:!i++相当于!4即为0,整个式子相当于0*8=0

 

 

 

 

1)首先说一下关于如果分清前后++的问题。

如果一个表达式里有前++或后++的话,如果来计算出表达式的值呢?如:

a = b ++;

我们可以把上面的一句语句拆成两个语句:

a = b;

b ++;

这两句话是等价的。而前++如何呢?如:

a = ++ b;

我们则可拆成:

++ b;

a = b;

这个方法很简单,前++就把++前移,后++就后移,然后就可知答案了。

 

2)++运算符做左值的问题。

比如有下面两个语句:

1. a ++ = b;

2. ++ a = b;

第一句话是错误的,我们可以这么理解,在重载后++运算符时,我们都会返回一个临时变量,比如这么写(假设A类里有个int型变量data):

int operator ++ (int)

{

       int temp = A.data;

       ++ A.data;

       return temp;

}

而临时变量是不可以做左值的。

第二句话当然是正确的,但也不完全正确,为什么呢?因为这是个未定义的值。我们不知道这个表达式结束后a的值到底是多少(这取决于不同的编译器,也就是我们不知道是先算“=”,还是先求“++”)。

写到这里,我突然想到了另一个有趣的语句,比如我们要将指针p指向的空间的值赋给指针q指向的空间,直到p所指的值为“0”时结束(假设一定会结束),我们可以这么写:

       while (p)

       {

              *q = *p;

              ++ p;

              ++ q;

}

上面的语句我们可以简单的写成:

while ( *q++ = *p++ );上面两段语句是等价的,咋看一下,怎么后++做左值了呢?其实这里并不是后++(临时变量)做左值,仔细分析下,就可明白是以临时变量为地址的内存空间做左值,这当然是合法的。

 

3)关于做循环变量时前后++的效率问题。

       比如一个for循环,我们可能这样写

       for ( int i=0; i<n; i++ ) { …… }

       上面的语句中“i++”我们完全可以换成“++i”,这两个到底有没有区别呢?

我认为是有区别的,刚才第2条时我们就说道后++是返回了一个临时变量,那这个临时变量不就是个开销吗?通过重载前后++的函数比较,我们可以发现,前++是效率比较高的。所以,以后如果在语句中,前后++都可以时,建议用前++。

原创粉丝点击