| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 874 人关注过本帖
标题:关于for语句中变量自加的问题
只看楼主 加入收藏
doom5211
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-7
收藏
 问题点数:0 回复次数:8 
关于for语句中变量自加的问题
C++primer第三版中大部分的for语句里面变量自加都是把++放在变量的前面,这样岂不是运行for循环前就要先把变量自加1啊?我们平时写for语句都是把++放在变量后,请问这是书上的特殊安排还是实质是没有什么区别的?有的困惑,因为不敢怀疑书上的东西.
搜索更多相关主题的帖子: 变量 语句 
2007-06-10 11:26
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
你是说for(int i = 0;true;++i)?
这里可以这样转变下
int i = 0;
while(true)
++i;(i++);
把上面的for翻译成下面的while,可以看出,++i,i++在这里是一样的效果。
习惯而已。


Fight  to win  or  die...
2007-06-10 11:34
jiaju111
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2007-3-27
收藏
得分:0 
第四版里有解释为什么提倡前++

在结果相同的情况下,用前++效率更高一点

因为他不用复制并保存自加前的副本

y=i++; 等价于y=(temp=i,i+=1,temp);

y=++i; 等价于y=(i+=1);

Everything is gonna be okay!
2007-06-10 12:58
doom5211
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-7
收藏
得分:0 
楼上讲的很具体,受益了.

2007-06-10 18:46
I喜欢c
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:64
帖 子:1749
专家分:0
注 册:2007-3-2
收藏
得分:0 
3 楼所说为真?

这倒是第一次听说哦..

 我是指针,却丢失了目标地址!          我是循环,却缺少了结束条件!      我是函数,却没有人来调用!   
2007-06-11 12:38
doom5211
Rank: 1
等 级:新手上路
帖 子:34
专家分:0
注 册:2007-6-7
收藏
得分:0 
我对三楼的解释理解如下,不知道是不是对的.
举例for(int ix=0; ix<sz; ++ix)
{
//循环体语句.
}
在for中运行了条件语句ix<sz后,执行下面的循环体语句,完成一次迭代后再执行++ix,这里ix++和++ix是一样的,ix++只不过先使用这个值再加1,++ix是先加1再使用,这里使用ix没有什么动作,故先加1或后加1都一样,而按照三楼说的,的确效率高一些。

2007-06-12 20:45
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
right.

Fight  to win  or  die...
2007-06-12 21:40
jiaju111
Rank: 1
等 级:新手上路
帖 子:94
专家分:0
注 册:2007-3-27
收藏
得分:0 

对于内置的int型对象和指针,编译器会优化 后++ 操作,

但是对于更多的复杂的迭代器类型,后++ 比前++ 做的工作要多,代价更高


Everything is gonna be okay!
2007-06-12 22:56
HJin
Rank: 6Rank: 6
等 级:贵宾
威 望:27
帖 子:401
专家分:0
注 册:2007-6-9
收藏
得分:0 
以下是引用jiaju111在2007-6-10 12:58:44的发言:
第四版里有解释为什么提倡前++

在结果相同的情况下,用前++效率更高一点

因为他不用复制并保存自加前的副本

y=i++; 等价于y=(temp=i,i+=1,temp);

y=++i; 等价于y=(i+=1);

This answer is to the point and concise.

The following source code is an eample for overloading operator ++ and -- for both postfix and prefix versions.


#include <iostream>


using namespace std;

class A
{
public:
A(int i_=0, double d_=0) : i(i_), d(d_) { }

const A operator++(int) /// postfix
{
A old(*this);

//++i;
//++d;
++(*this);

return old;
}

/**
This is an option for the postfix ++. But since it returns void,
we cannot use it in an expression, say (a++) + 1.
*/
//void operator++(int)
//{
// ++(*this);
//}

A& operator++() /// prefix
{
++i;
++d;

return (*this);
}

const A operator--(int)
{
A old(*this);

--i;
--d;

return old;
}

A& operator--()
{
--i;
--d;

return *this;
}
void print() const
{
cout<<"i = "<<i<<", d = "<<d<<endl;
}

private:
int i;
double d;
};


int main(int argc, char** argv)
{
A a(2, 3.4);
a.print();

(a++);
a.print();
++a;
a.print();

//A b(-3, 9.2);
//b.print();

//b--;
//b.print();
//--b;
//b.print();


return 0;
}


I am working on a system which has no Chinese input. Please don\'t blame me for typing English.
2007-06-13 03:50
快速回复:关于for语句中变量自加的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.015903 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved