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条时我们就说道后++是返回了一个临时变量,那这个临时变量不就是个开销吗?通过重载前后++的函数比较,我们可以发现,前++是效率比较高的。所以,以后如果在语句中,前后++都可以时,建议用前++。
- c
- c
- c
- c
- C
- c
- c
- c
- C+
- c
- C
- c
- c
- c
- C
- C
- c
- C
- Clutter学习(十一):动态效果设置ClutterBehaviour
- VC2008FeaturePack SDI/MDI项目的字体设置
- NX/JA简介及应用开发实例 / Introduction and Example of NX Journaling and Automation (JA)
- Flex设置html(页面标题)title问题
- NET学习 (1)NET平台体系结构
- C++
- 关于sql 2005/2008 缓存依赖
- 几种兼容IE和火狐 图片预览的JS代码
- javscript 冒泡事件处理方法 支持(IE,firefox)
- Dojo基本知识
- Response.End
- SqlHelper类VB.NET版
- 1
- 最近做软件的一些感受