for循环中的前缀与后缀[重复]

Posted

技术标签:

【中文标题】for循环中的前缀与后缀[重复]【英文标题】:Prefix vs postfix in a for loop [duplicate] 【发布时间】: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++ 中,通常最好使用前缀表示法。 【参考方案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),结果也是一样的。因此,一种形式不会被优化到另一种形式中。

【讨论】:

以上是关于for循环中的前缀与后缀[重复]的主要内容,如果未能解决你的问题,请参考以下文章

表达式中的Python“in”关键字与for循环中的[重复]

for循环循环取值的时候,当出现了与以前循环出的值有重复的值时就只取出重复之前的值, 比如整个循环

Java中的for循环[重复]

HDU 1358 Period

控制语句2:循环:for 与 while

在C中的while循环或for循环之后没有代码执行[重复]