【问题标题】:Prefix vs postfix in a for loop [duplicate]for循环中的前缀与后缀[重复]
【发布时间】:2021-04-22 10:09:51
【问题描述】:

for 循环中,因为最后一个(更新)表达式不能涉及赋值,所以使用前缀或后缀递增/递减是否微不足道?例如:

for (int i=0; i < 10; i++) {...}

对比

for (int i=0; i < 10; ++i) {...}

for循环的更新表达式中,是否会出现前缀或后缀会很重要的情况?

【问题讨论】:

  • "last (update) 表达式不能涉及赋值" 为什么你认为它不能?
  • @dxiv 实际上,我没有。我只是从未见过或使用过它,所以也许我错了......
  • @samuelbrody1249 int n = -1; for(int i = 0; i &lt; 10; n = i++);
  • for (node *curr = head; curr != NULL; curr = curr-&gt;next) { … } 用于处理链表。
  • 在 C 语言中,编译器会同等对待这两者——如果不是,您需要更好的编译器!在 C++ 中,由于可以为用户定义的类型分别实现前缀和后缀运算符,因此存在与前缀运算符不存在的后缀增量相关的开销。因此,在 C++ 中,通常最好使用前缀表示法。

标签: c


【解决方案1】:

没有区别。 int 循环变量上的前缀与后缀产生相同的程序集。我在https://godbolt.org/ 上测试了两种循环形式,循环体在x86-64 gcc 上调用printf("%d\n", i)

前缀形式 for (int i=0; i &lt; 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 &lt; 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),结果也是一样的。因此,一种形式不会被优化到另一种形式中。

【讨论】:

    猜你喜欢
    • 2014-05-15
    • 1970-01-01
    • 2014-08-11
    • 2017-09-01
    • 1970-01-01
    • 2012-10-03
    • 2017-12-02
    • 2013-12-06
    • 2021-01-21
    相关资源
    最近更新 更多