for循环中的前缀与后缀
在for
循环中,因为最后一个(更新)表达式不能涉及赋值,所以它是否使用前缀或后缀增量/减量是微不足道的吗?例如:
for (int i=0; i < 10; i++) {...}
对比
for (int i=0; i < 10; ++i) {...}
是否会出现在for
循环的更新表达式中添加前缀或后缀很重要的情况?
回答
没有什么不同的。int 循环变量上的前缀与后缀生成相同的程序集。我在https://godbolt.org/上测试了两种循环形式,循环体调用printf("%dn", i)
x86-64 gcc。
前缀形式for (int i=0; i < 10; ++i) {...}
产生:
mov DWORD PTR [rbp-4], 0 ; Set i = 0.
.L3:
cmp DWORD PTR [rbp-4], 9 ; Compare i vs. 9.
jg .L4 ; Exit the loop if i > 9.
(... Loop body code ...)
add DWORD PTR [rbp-4], 1 ; Increment i.
jmp .L3 ; Jump back o L3.
.L4:
后缀形式for (int i=0; i < 10; i++) {...}
产生相同的程序集(除了跳转标签名称的外观差异):
mov DWORD PTR [rbp-4], 0 ; Set i = 0.
.L7:
cmp DWORD PTR [rbp-4], 9 ; Compare i vs. 9.
jg .L8 ; Exit the loop if i > 9.
(... Loop body code ...)
add DWORD PTR [rbp-4], 1 ; Increment i.
jmp .L7 ; Jump back to L7.
.L8:
即使我禁用优化器(编译标志-O0
),结果也是一样的。因此,一种形式不会被优化为另一种形式。