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),结果也是一样的。因此,一种形式不会被优化为另一种形式。


以上是for循环中的前缀与后缀的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>