作者adrianshum (Alien)
看板C_and_CPP
标题Re: [问题] for回圈 和++i i++的问题
时间Mon Aug 24 12:30:23 2009
※ 引述《Waterpig (waterpig)》之铭言:
: ++i 是先将i指派为i+1後再将i+1的值传出
: i++ 是先传出i值 再指派i为i+1
: 以上我的理解应该没错吧?
: 我的问题在於for回圈
: for回圈的流程是
: ┌──假──→离开回圈
: │
: 进入回圈→设定记次变数起始值→测试条件式──真─→程式区段→更新计次变数
: ↑ │
: │ │
: └──────────────┘
: 这时候 for (i=0;i<=3;++i){程式区段}
: 和 for (i=0;i<=3;i++){程式区段}
: 两个差别在於哪?
这样的理解其实有点错
比较正确的是, ++i 是 increment 後, 再 evaluate 为 increment 後的值
i++ 则是 increment 後, evaluate 为 increment 前 的值.
你写 C++, 写过 operator overloading 就会感受到上面说的跟你说的分别
在哪里.
另, for 的差别, 请看
#169W5nMh
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 202.155.236.82
1F:推 VictorTom:所以才会说未最佳化的话, i++可能效能略差, 因为多一个 08/24 12:35
2F:→ VictorTom:mov与暂用一个temp register....@_@" 08/24 12:35
3F:推 ledia:primitive type, compiler 不至於会多用一个 register 吧 08/24 13:30
4F:推 sjgau:我是习惯使用 i++, 既然楼上的都这麽说,我来 bench 看看 08/24 13:36
5F:推 VictorTom:请教l大, 为什麽primitive type就不用多个 reg 呢?_? 08/24 13:38
6F:→ VictorTom:回s大, 个人觉得disasm比较直接, 因为通常i++/++i的 08/24 13:38
7F:→ VictorTom:overhead远小於其他code吧?? 光是compare就不知道比 08/24 13:39
8F:→ VictorTom:它慢多少了不是吗?_? 08/24 13:39
9F:→ VictorTom:啊, 忘了回圈也可以不要终止条件无穷跑下去....XD 08/24 13:40
10F:推 ledia:我猜测 compiler 会知道 i++ 要不要 keep 那个 i 吧 08/24 17:09
11F:→ ledia:至少我 gcc -S 看起来是没差的, 其它 compiler 就不知了 08/24 17:10
12F:推 VictorTom:compiler知道要不要keep, 就是有一定程度opt啦@_@" 08/24 17:33
13F:→ VictorTom:小弟本来是想说直接看 i++ 与 ++i 的组语各是怎翻的XD 08/24 17:33
14F:推 ledia:没加 optimize 参数喔, 我觉得是免费送的 XD 08/25 02:17
15F:推 holymars:对primitive type根本没差.. 08/25 18:44