结论:一样。编译器和编译器之间可能有点区别但是程序不会变。
0x00
一直不清楚到底是因为懒还是真的为了效率,要把" i = i + 1 "写成" i++ "或者" i += 1 ",
今日闲来无事,尝试一下。
0x01
直接的赋值语句。
编译器:Dev-C++ 5.11
代码:
void asd() {} int main() { int i=0; i++; asd(); //方便在IDA中区分上下文 i=i+1; asd(); i+=1; return 0; }
反汇编:
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, 1 mov [ebp+i], eax call sub_41110E //void asd() mov eax, [ebp+i] //这三行是i+=1 add eax, 1 mov [ebp+i], eax
总结:一毛一样。
0x03
换一种语句,用for试试
编译器:Dev-C++ 5.11
代码:
void asd() {} int main() { int i; for(i=0; i<5; i++) ; asd(); for(i=1; i<6; i++) ; asd(); for(i=2; i<7; i++) ; asd(); return 0; }
反汇编: 总而言之还是那个样子。
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 0; }
反汇编:
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 的。
原文:https://www.cnblogs.com/iishuu/p/10706580.html