搜索
bottom↓
回复: 40

for 循环中i++ 和++i 有什么区别

[复制链接]

出0入0汤圆

发表于 2018-7-30 08:27:35 | 显示全部楼层 |阅读模式
在for循环中,如:
   for(i=0;i<5;i++)与
   for(i=0;i<5;++i)
在for循环的次数上没有区别;
那么 两种写法效率不同?

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入442汤圆

发表于 2018-7-30 08:29:46 来自手机 | 显示全部楼层
单独一条语句都是inc ebx。

出0入0汤圆

发表于 2018-7-30 08:37:50 | 显示全部楼层
比较效率无意义。正确规范的写法是i++。任何时候都不要++i。

出0入8汤圆

发表于 2018-7-30 08:51:07 | 显示全部楼层
对于目前的编译器而言,这两种写法,没有差异。
还是多用 i++ 吧。

出0入91汤圆

发表于 2018-7-30 08:58:31 | 显示全部楼层
本帖最后由 ackyee 于 2018-7-30 09:00 编辑

单纯从i++跟++i来来看是有差异的   i++是先用后加    ++i是先加后用   
比方说   
i=0;
a=i++;   结果a是0   
a=++i;   结果a是1

两条语句之后的运算结果 i都是1

没仔细看 楼主问的for循环,那是否一样没实践过

出0入0汤圆

发表于 2018-7-30 08:59:57 | 显示全部楼层
用在你这里没区别。
i++是先引用i,用完了再+;++i是先+,加完了再引用新的i。

出0入8汤圆

发表于 2018-7-30 09:01:03 | 显示全部楼层
ackyee 发表于 2018-7-30 08:58
有差异的  大家没有好好看书,  i++是先用后加    ++i是先加后用   
比方说   
i=0;

这是 i++ 和 ++i 的区别。
而不是在 for 循环中,使用 i++ 和 ++i 的差别。

出0入91汤圆

发表于 2018-7-30 09:01:27 | 显示全部楼层
security 发表于 2018-7-30 09:01
这是 i++ 和 ++i 的区别。
而不是在 for 循环中,使用 i++ 和 ++i 的差别。

是的  我刚漏看了

出0入0汤圆

发表于 2018-7-30 09:05:01 | 显示全部楼层
就是先使用,还是先自加一的区别

出10入0汤圆

发表于 2018-7-30 09:17:02 来自手机 | 显示全部楼层
如果i只是一般的变量(基本类型),那么没有区别,现在的优化编译器很清楚你需要做什么。
但如果i是一个重载了两种operator++的对象来说,那就有区别了,后++可能会产生额外的对象拷贝,而且因为副作用的不确定性,编译器也不能自作主张的用前++来取代。

出0入0汤圆

发表于 2018-7-30 09:17:07 | 显示全部楼层
ackyee 发表于 2018-7-30 08:58
单纯从i++跟++i来来看是有差异的   i++是先用后加    ++i是先加后用   
比方说   
i=0;


结论:有自加又使用时才有区别,加了不用没有区别。

出0入476汤圆

发表于 2018-7-30 09:42:15 | 显示全部楼层
真不清楚 这些技巧是为了书写方便还是炫技。难道多写一个等式就这么难吗。国内C考试很多时候就考这种玩意

出0入0汤圆

发表于 2018-7-30 09:54:36 来自手机 | 显示全部楼层
for(auto a:m_xx) for_each

出0入147汤圆

发表于 2018-7-30 10:41:46 | 显示全部楼层
独立语句,没有差别。

出0入0汤圆

发表于 2018-7-30 11:46:55 | 显示全部楼层
在for循环中,没有区别,都是i=i+1的结果,效率一样。总是要执行++

出0入4汤圆

发表于 2018-7-30 11:51:25 | 显示全部楼层
先加明显少循环一次!

出0入0汤圆

 楼主| 发表于 2018-7-30 11:53:30 | 显示全部楼层
yoz 发表于 2018-7-30 09:17
如果i只是一般的变量(基本类型),那么没有区别,现在的优化编译器很清楚你需要做什么。
但如果i是一个重 ...

后++产生额外的对象拷贝 怎么理解呀 ?

出0入0汤圆

发表于 2018-7-30 11:59:28 来自手机 | 显示全部楼层
完全一样。

出10入0汤圆

发表于 2018-7-30 12:46:57 来自手机 | 显示全部楼层
wq_601840968 发表于 2018-7-30 11:53
后++产生额外的对象拷贝 怎么理解呀 ?

后++得保存一份原来的对象并返回。

出0入0汤圆

发表于 2018-7-30 12:55:27 | 显示全部楼层
hz_fujian 发表于 2018-7-30 11:51
先加明显少循环一次!

要不, 你这样看?
for(i=0;i<5;){
        ++i;
}

出0入34汤圆

发表于 2018-7-30 15:09:05 | 显示全部楼层
于非比较级内使用完全无差别,但是使用于单纯仅是想让 i 多加个 1 时,建议还是别使用 ++i 较好。
为何会说别这样用较好?因为 C 是可以被继承与移植的,接手您的代码的人或日后将其代码贴在网路上,我不知道会有多少人用异样的眼光看您啊?!哈~

出0入0汤圆

发表于 2018-7-30 15:39:57 | 显示全部楼层
先加后用和先用后加的区别吧
5楼说的挺对的啊

出0入4汤圆

发表于 2018-7-30 16:07:15 | 显示全部楼层
for循环是先判断后执行i++ / ++i, 所以没区别

出0入0汤圆

发表于 2018-7-30 16:08:39 来自手机 | 显示全部楼层
先取后加与先加后取,c的语法表达己经很直观了

出0入0汤圆

发表于 2018-7-30 16:44:13 | 显示全部楼层
wy2000 发表于 2018-7-30 09:42
真不清楚 这些技巧是为了书写方便还是炫技。难道多写一个等式就这么难吗。国内C考试很多时候就考这种玩意{: ...

a++比a=a+1的好处是阅读方便,试想一下如果a是一个很长的变量名时,写成后者就需要看两次变量

出0入0汤圆

发表于 2018-7-30 16:46:43 | 显示全部楼层
效率是一样的,但是约定熟成只有第一种写法

出0入0汤圆

发表于 2018-7-30 17:06:45 | 显示全部楼层
1、在C++中,如果使用stl迭代器的话,推荐使用前缀++,比如:

vector<int> vec = {1, 2, 3, 4 };
for (vector<int>::iterator it = vec.begin(); it != vec.end(); ++it)
{
     ......
}
++it是重载了前缀++运算符,实现一般是当前对象向前走一步,然后返回当前对象的引用*this。如果是后缀++的话,实现是先把当前对象赋值给一个临时对象,然后当前对象向前走一步,然后返回临时变量的值,这中间涉及到临时变量的构造函数和析构函数调用,比使用前缀++耗资源。

2、但是如果是在C语言中的话,估计编译器把这2种写法都编译成一样的机器代码了,因此没什么区别。

出0入0汤圆

 楼主| 发表于 2018-7-31 14:45:51 | 显示全部楼层
EddieZhu 发表于 2018-7-30 17:06
1、在C++中,如果使用stl迭代器的话,推荐使用前缀++,比如:

vector vec = {1, 2, 3, 4 };

受教,感谢;
在使用迭代器时,还是有区别的,其他情况应该没有区别。

出0入8汤圆

发表于 2018-7-31 15:19:57 | 显示全部楼层
EddieZhu 发表于 2018-7-30 17:06
1、在C++中,如果使用stl迭代器的话,推荐使用前缀++,比如:

vector vec = {1, 2, 3, 4 };

耗资源的话,应该还是 debug 配置,
开了优化的话,编译器应该要能优化掉的,因为这个临时变量并没有用吧。

出0入0汤圆

发表于 2018-7-31 17:52:59 | 显示全部楼层
放在for中都一样,但为了把自己绕晕,推荐用i++

出0入0汤圆

发表于 2018-7-31 21:01:11 来自手机 | 显示全部楼层
for中无差别

出0入0汤圆

发表于 2018-7-31 21:48:59 来自手机 | 显示全部楼层
如果i是u8,把5改成255试试,就知道区别了

出0入0汤圆

发表于 2018-8-1 11:28:03 | 显示全部楼层
zt2012 发表于 2018-7-31 21:48
如果i是u8,把5改成255试试,就知道区别了

这样做的话,不管哪种写法,都不会退出这个循环的呀。

出0入0汤圆

发表于 2018-8-1 14:03:04 | 显示全部楼层
for(i=0;i<5;i++){print i;}与    for(i=0;i<5;++i){print i;}    你就知道区别了。

出0入0汤圆

发表于 2018-8-1 14:28:30 | 显示全部楼层
ackyee 发表于 2018-7-30 08:58
单纯从i++跟++i来来看是有差异的   i++是先用后加    ++i是先加后用   
比方说   
i=0;

你的解释是正确的。

出0入8汤圆

发表于 2018-8-1 14:31:38 | 显示全部楼层

不理解,
你这写法,有区别吗?

出0入0汤圆

发表于 2018-8-1 17:40:08 | 显示全部楼层
security 发表于 2018-8-1 14:31
不理解,
你这写法,有区别吗?

有区别,我认为前面一个更好看
   

出0入0汤圆

发表于 2018-8-1 20:35:18 | 显示全部楼层
在for的后处理位置,结果都一样

出0入0汤圆

发表于 2018-8-1 20:44:56 | 显示全部楼层
最烦这种写花样的了,明明有容易理解的方法,偏要写个花出来

出0入0汤圆

发表于 2018-8-8 11:11:48 | 显示全部楼层
感觉是一样的
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 13:11

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表