我关掉编译器的优化,还看不到++i ,i++的不同.....

CodeNazior 2008-10-25 04:24:34
visual studio 2008

//optimization 选项为disabled
#include <iostream>
using namespace std;
int main(){
int i = 0,a,b;
a=++i;
cout << a << endl;
b=i++;
cout << b << endl;
return 0;
}

下面是汇编代码,怎么还是一样啊?没看见生成中间变量的啊,都是那几步,步骤顺序不一样而已啊

; a=++i;
004113E5 mov eax,dword ptr [i]
004113E8 add eax,1
004113EB mov dword ptr [i],eax
004113EE mov ecx,dword ptr [i]
004113F1 mov dword ptr [a],ecx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; b=i++;
00411424 mov eax,dword ptr [i]
00411427 mov dword ptr [b],eax
0041142A mov ecx,dword ptr [i]
0041142D add ecx,1
00411430 mov dword ptr [i],ecx


...全文
176 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
jackzhhuang 2008-10-25
  • 打赏
  • 举报
回复
int j = ++i
int j = i++

以上我不信还是一样的!
goodluckyxl 2008-10-25
  • 打赏
  • 举报
回复
这些人简直就是让人无语

整天就研究这些玩意,现在计算机cpu运算速度已经非常之快了

++i 比 i++是少一次copy 但是寄存器操作级别的速度 影响你多少啊

bxhzct 2008-10-25
  • 打赏
  • 举报
回复
汇编代码一样,效率就是一样的!!
ysuliu 2008-10-25
  • 打赏
  • 举报
回复
内置类型一样的。。。
ribut9225 2008-10-25
  • 打赏
  • 举报
回复
++i和i++的区别?
这两个的区别是我想你应该也明白的一些。
至于怎么用

我还是先给你举几个例子吧:

a=0;
for(i=0;i<3;i++)
{b=a++; c=++b;
printf("%d,%dn",a,b,c);
}


前面的声明部分我省略了


先讲一下 他们的执行结果吧:
第一次循环的时候 首先执行i=0 判断i是否 <3
由于此时小雨3 所以再第一次执行 大括号内的语句 b=a++ 这个时候a只加1 但是这个时候加的1在这次循环里面不参与 b=a++的运算 也就是说 这个时候的b=0 a=1
而c则由于b加1的基础上面参加了运算 则c是等于1的 此时b=1
在 这个时候输出了1,1,1
要进入第二次循环则要首先执行依次i++ 使得i加了1
判断i<3是否正确 如果正确则再执行大括号里面的语句

按照上面的循环 知道 i等于3 的时候 结束循环 也就是程序执行两次之后 由于i=3 再次判断i<3时 不成立 结束循环

我补充些:
其实要深入到编译器去考虑,有时编译器会对++进行优化,可以从下面的例子看出,请大家将下面的例子自己运行下,会发现很多奇怪的东西:
int i=0;
int a;
a = (i++) + (++i) + (i++); //不等于a = (i++) + (i++) + (++i) ; 前面=3,后面=1

我来解释下:
编译器对a = (i++) + (++i) + (i++); 是这样执行的:
1、a = (i++) + (++i) + (i++);
-> a=i++ //a=i=0 (i=0这时记住 i 还没+1)
-> a=(i++) + (++i) //a=i+1 (i=1这时记住 i 已经+1,并且表达式值为1),这时由于i的值已经变成1,带入,则a=2
-> a=(i++) + (++i)+ (i++) //a=2+(i++)=2+i=2+1 (i=1这时记住 i 还没+1,并且表达式值为i),最后计算完表达式后,编译器会对i进行自增调整,即i=3;

总的来说,就是编译器碰到 i++时,先不自增i,表达式值用i代替,当i的值变化后才带代入计算;碰到 i++i时,先 i 自增,然后算表达式值,并将这时的 i 值代入前面的 i 替换掉。

为巩固理解,下面举个例子:
int i=0;
int a;
a=(i++) + (i++) + (i++) = 0 //->a=i+i+i,将 i =0代入得a=0,然后 i 自增3次
而a=(++i) + (++i) +(++i) = 7 //->a=i+i i=2代入得a=4+(++i)

++i,--i
在使用 i之前,使i的值加1或者减1
i++,i--
在使用i之后,使i的值加1或者减1

ribut9225 2008-10-25
  • 打赏
  • 举报
回复
++i是先i自增1,再赋值给表达式
i++是先将i的值赋给表达式,然后i再自增1
ribut9225 2008-10-25
  • 打赏
  • 举报
回复
++i 和 i++在单独运行的时候没啥问题

int k=0;
int i=0;

k = i++ 和 k = ++i
这两条语句对于最后i的值没有影响,但是k的值就不同了
太乙 2008-10-25
  • 打赏
  • 举报
回复
lz想咋变?
帅得不敢出门 2008-10-25
  • 打赏
  • 举报
回复
对于内置类型 前后缀++ --效率上没啥区别
当做赋值用是其汇编指令条数是一样的
sagegz 2008-10-25
  • 打赏
  • 举报
回复
UP!

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧