首先说结论, 我习惯在循环中用i++, 下面这两种写法结果是相同的
for (int i = 0; i<5; i++) {
printf("%d", i);
}
for (int i = 0; i<5; ++i) {
printf("%d", i);
}
以前上学的时候学过 i++ 和 ++i是不同的,哪里不同呢
int a = 0;
int b = a++; //b的结果是0
我们分析一下汇编
int a = 0;
00F0236E mov dword ptr [a],0
int b = a++; //b的结果是0
00F02375 mov eax,dword ptr [a]
00F02378 mov dword ptr [b],eax
00F0237B mov ecx,dword ptr [a]
00F0237E add ecx,1
00F02381 mov dword ptr [a],ecx
上边1)a的值给寄存器eax 2)寄存器eax的值给b 3)a的值给寄存器ecx 4)寄存器ecx加1 5)寄存器ecx的值给a.
int a = 0;
int b = ++a; //b的结果是1
我们分析一下汇编
int a = 0;
00E1236E mov dword ptr [a],0
int b = ++a; //b的结果是1
00E12375 mov eax,dword ptr [a]
00E12378 add eax,1
00E1237B mov dword ptr [a],eax
00E1237E mov ecx,dword ptr [a]
00E12381 mov dword ptr [b],ecx
上边1)a的值给寄存器eax 2)寄存器eax加1 3)寄存器eax的值给a 4)a的值给寄存器ecx 5)寄存器ecx的值给b
总结: 我是在vs2015 debug下运行的, 也许release模式会精简一些,C++关于i++和++i的语法设计的还是挺奇怪的,我要是标准制定者我就把++i这个用法给禁了(^_^)
有些文章说循环中用++i会快一些,我们看一下汇编分析一下,看看计算机爸爸看到的机器码到底是啥.
int a = 0;
003A22DE mov dword ptr [a],0
for (int i = 0; i<5; i++) {
003A22E5 mov dword ptr [ebp-14h],0
003A22EC jmp main+37h (03A22F7h)
003A22EE mov eax,dword ptr [ebp-14h]
003A22F1 add eax,1
003A22F4 mov dword ptr [ebp-14h],eax
003A22F7 cmp dword ptr [ebp-14h],5
003A22FB jge main+46h (03A2306h)
a = 1;
003A22FD mov dword ptr [a],1
}
003A2304 jmp main+2Eh (03A22EEh)
for (int i = 0; i<5; ++i) {
003A2306 mov dword ptr [ebp-20h],0
003A230D jmp main+58h (03A2318h)
003A230F mov eax,dword ptr [ebp-20h]
003A2312 add eax,1
003A2315 mov dword ptr [ebp-20h],eax
003A2318 cmp dword ptr [ebp-20h],5
003A231C jge main+67h (03A2327h)
a = 1;
003A231E mov dword ptr [a],1
}
003A2325 jmp main+4Fh (03A230Fh)
看到没, 两种写法在vs2015 debug下的写法居然一下, 都是 1) mov 把i的值给寄存器eax, 2)eax寄存器值加1, 3)eax寄存器的值给回i 4)cmp 尽心比较.
这说明两种写法对于计算机爸爸来时,看到的都一样. 查了下资料,没看到linux是怎么翻译汇编的,既然大家都说++i比较快,如果你还是不放心,或者要显得高大上,可以用++i.