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 实际上,我没有。我只是从未见过或使用过它,所以也许我错了...... @samuelbrody1249int n = -1; for(int i = 0; i < 10; n = i++);
for (node *curr = head; curr != NULL; curr = curr->next) …
用于处理链表。
在 C 语言中,编译器会同等对待这两者——如果不是,您需要更好的编译器!在 C++ 中,由于可以为用户定义的类型分别实现前缀和后缀运算符,因此存在与前缀运算符不存在的后缀增量相关的开销。因此,在 C++ 中,通常最好使用前缀表示法。
【参考方案1】:
没有区别。 int 循环变量上的前缀与后缀产生相同的程序集。我在https://godbolt.org/ 上测试了两种循环形式,循环体在x86-64 gcc 上调用printf("%d\n", i)
。
前缀形式 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循环中的前缀与后缀[重复]的主要内容,如果未能解决你的问题,请参考以下文章
表达式中的Python“in”关键字与for循环中的[重复]