作者VictorTom (鬼翼&娃娃鱼)
看板C_and_CPP
标题Re: [问题] preincrement和 postincrement的差别
时间Sat Apr 18 18:09:20 2009
※ 引述《nswrthh (xjapan)》之铭言:
: a是一个变数,那麽++a和a++是哪里不同?他们的定义各是什麽?
小弟我论等一下很快就会有人推文说为什麽不爬文/看书/google....XD
观念性或者细节我不会说, 我们直接用简单的例子来看看差在哪里....
int a, b, c;
a = 0;
b = a++; // 会得到 b 为 0.
a = 0;
c = ++a; // 会得到 c 为 1.
也就是在一个statement里, 对a的取值是在+=1之前还是+=1之後做:)
所以上面的两个例子也可以重新拆开理解成下面这样子的表示法....
a = 0;
b = a;
a += 1;
a = 0;
a += 1;
c = a;
在有些时候, 两者基本上没什麽不同(也许compiler最佳化前有差异)
在有些时候, 这两者弄错了不是array会爆掉, 就是有错误结果@_@"
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 220.132.174.98
※ 编辑: VictorTom 来自: 220.132.174.98 (04/18 18:13)
1F:→ MOONRAKER:上次有人闹一个笑话:他写了一个程式,大意是 04/18 23:39
2F:→ MOONRAKER:while (a<100) { a=a++; } 结果下场是永远跑不完… 04/18 23:40
3F:→ MOONRAKER:喔对了,当然前面有 int a=0; 04/18 23:41
4F:→ MOONRAKER:不过这其实是eval order的问题。compiler-dependent. 04/18 23:42
5F:→ VictorTom:不知道为什麽看到这个自己和自己运算的statement, 就想 04/19 00:36
6F:→ VictorTom:到小弟刚学会用 a^=b^=a^=b; 这种方法耍帅来swap时遇到 04/19 00:37
7F:推 wowtiger:结果还是单纯的 mov 比较快 因为 xor 没法并行 mov 可以 04/19 00:39
8F:→ VictorTom:的悲剧: sort一个array, 没注意到换了a[i]和a[i]...Orz 04/19 00:40
9F:→ wowtiger:阿 抱歉 原来还有要推文阿 04/19 00:41
10F:→ VictorTom:并行?? temp swp不会有WAR的问题吗?_? 虽然看起来可以 04/19 00:43
11F:→ VictorTom:用reg rename来解决; w大不会啦, 我刚想太久了^^|| 04/19 00:43
12F:→ VictorTom:因为我一时想不起来当初到底干了什麽蠢事debug了半天XD 04/19 00:43
13F:推 wowtiger:所以有些 trick 还是要知道为何有这个 trick 存在 04/19 00:46
14F:→ VictorTom:其实说真的除了少用个temp我还真不知道它的trick在哪Orz 04/19 00:57
15F:推 wowtiger:trick就在不用temp这样而已XD 这是CPU只有一个reg才需要 04/19 01:00
16F:→ VictorTom:所以有些trick应该拿来当历史故事书看一看就好....XDDD 04/19 01:21