所以这就是visualstudio在自动完成for循环时提供的功能。有人告诉我,++I比I++更有效,因为预增量不需要编译器创建一个临时变量来存储I。我应该使用++I,除非我真的需要I++。视觉工作室默认这样做有什么原因吗?还是我想得太多了?
for (size_t i = 0; i < length; i++)
{
}
这个答案有些是基于我的经验,而不是任何确凿的事实,所以请对此持怀疑态度。
i++作为默认循环增量的原因
后缀与前缀
后缀增量器i++生成一个临时的预增量值,该值在表达式中"向上"传递,然后变量i随后递增。
前缀incremetor++i不产生临时对象,而是直接递增i,并将递增的结果传递给表达式。
性能
看看两个简单的循环,一个使用i++,另一个使用++i,让我们检查生成的汇编
#include <stdio.h>
int main()
{
for (int i = 0; i < 5; i++) {
//
}
for (int j = 0; j < 5; ++j) {
//
}
return 0;
}
使用GCC生成以下程序集:
main:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 0
.L3:
cmp DWORD PTR [rbp-4], 4
jg .L2
add DWORD PTR [rbp-4], 1
jmp .L3
.L2:
mov DWORD PTR [rbp-8], 0
.L5:
cmp DWORD PTR [rbp-8], 4
jg .L4
add DWORD PTR [rbp-8], 1
jmp .L5
.L4:
mov eax, 0
pop rbp
ret
L3对应于第一环路,而L5对应于第二环路。在这种情况下,编译器会优化掉任何差异,从而产生相同的代码,因此没有性能差异。
外观
看看下面的三个循环,哪一个最吸引你?
for (int i = 0; i < 5; i++) {
//
}
for (int i = 0; i < 5; ++i) {
//
}
for (int i = 0; i < 5; i+=1) {
//
}
对我来说,i+=1是正确的,++我只是觉得有点向后
人体工程学
- i++(-你的手已经在正确的位置打字了(++
- ++i( -需要从上排移动到本垒和后排
历史
较老的C程序员和当前编写系统级代码的C程序员经常使用i++来编写非常紧凑的代码,例如:
// print some char * s
while(*s)
putc(*s++);
// strcpy from src to dest
while (*dest++=*src++);
正因为如此,i++成为了C程序员最先达到的增量,最终成为++i与i++功能相同的情况下的一种标准。
选择++i
只会有一个样式选择。
在这种情况下,没有任何业绩增长。这是一个神话。
对于int
s上的简单循环,i++
也更"传统"。
你当然可以自由地用自己的风格写自己的循环!