结论:一样。编译器和编译器之间可能有点区别但是程序不会变。


0x00

  一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或者" i += 1 ",

  今日闲来无事,尝试一下。

0x01

  直接的赋值语句。

  编译器:Dev-C++ 5.11

  代码:

void asd() {}
int main() {
int i=;
i++;
asd();  //方便在IDA中区分上下文
i=i+;
asd();
i+=;
return ;
}

  反汇编:

mov     [rbp+i], 0    //i的初始化
add [rbp+i], 1    //i++;
call _Z3asdv ; asd(void)
add [rbp+i], 1    //i=i+1;
call _Z3asdv ; asd(void)
add [rbp+i], 1    //i+=1;

  总结:一毛一样。

0x02

  换个编译器

  编译器:Microsoft Visual Studio 2013

  代码:跟上边的一样

  反汇编:  //突然变得裹脚布

mov     [ebp+i], 0      //i的初始化
mov eax, [ebp+i]    //这三行是i++
add eax, 1        //先取出i放到eax,加1之后再放回去
mov [ebp+i], eax
call sub_41110E      //void asd()
mov eax, [ebp+i]    //这三行是i=i+1
add eax,
mov [ebp+i], eax
call sub_41110E      //void asd()
mov eax, [ebp+i]    //这三行是i+=1
add eax,
mov [ebp+i], eax

  总结:一毛一样。

0x03

  换一种语句,用for试试

  编译器:Dev-C++ 5.11

  代码:

void asd() {}
int main() {
int i;
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
for(i=; i<; i++) ;
asd();
return ;
}

  反汇编:  总而言之还是那个样子。

0x04

  换编译器:Microsoft Visual Studio 2013

  代码:和上边一样

  反汇编:    总而言之还是老样子。

0x05

  还是不太放心

  试试,如果是两个变量呢?

  编译器:Dev-C++ 5.11

  代码:

void asd() {}
int main() {
int i, j;
asd();
i=i+j;
asd();
i+=j;
asd();
return ;
}

  反汇编: 

call    _Z3asdv         ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)
mov eax, [rbp+var_8]
add [rbp+var_4], eax
call _Z3asdv ; asd(void)

  一样。

0x06

  总结:i++、i=i+1、i+=1, 效果一样。

  i+=j、i=i+j,也是一样的

  但是既然能够少写两个字符,为什么还要多写两个呢?

  况且,用 i += j 的,总是看不起写 i = i + j 的。

最新文章

  1. Python中对字节流/二进制流的操作:struct
  2. 2013最常用的NoSQL数据库
  3. 同 一个页面,不同请求路径,如何根据实际场景写JS
  4. linux中,常用的账号管理命令
  5. .htaccess的301重定向代码
  6. 机器学习笔记之人工神经网络(ANN)
  7. code:blocks 编译环境设置
  8. coco2d-html5制作弹弓射鸟第一部分---橡皮筋
  9. MVC再次学习1
  10. &lt;%=id%&gt;是什么意思
  11. 【Yom框架】漫谈个人框架的设计之一:是IRepository还是IRepository&lt;T&gt;?
  12. linux 脚本保留日志
  13. 【学而思】利用shouldComponentUpdate钩子函数优化react性能以及引入immutable库的必要性
  14. css清除浮动方法小结
  15. Vi 操作命令
  16. python-web微信实现
  17. eclipse经常出现——未响应!!!
  18. 再谈一次关于Java中的 AIO(异步IO) 与 NIO(非阻塞IO)
  19. 怎样将M4A音频格式转换成MP3格式
  20. 【linux】linux命令grep + awk 详解

热门文章

  1. virtualbox+vagrant学习-4-Vagrantfile-5-Machine Settings
  2. selenium + python自动化测试unittest框架学习(六)分页
  3. 多线程之synchronized
  4. oracle 判断字段相等,但类型不同引起的性能问题
  5. Linux服务-ftp
  6. 网格布局(GridLayout) 行数与列数
  7. vue指令:v-model绑定表单控件;v-model与v-bind结合使用
  8. [笔记] Delphi 10.2.1 Tokyo 安装使用笔记
  9. 树莓派 ubuntu 系统下修改config.txt文件调整分辨率记录
  10. VB6 加载水晶报表例子