在x = x + 1
中,x
评估两次?如果是这样,那是x += 1
,x
只是评估一次吗?两个表达式如何根据编译器中间代码进行评估?
例如,x++
可能意味着:取x
的位置,将x
的内容加载到寄存器中,并在内存中增加x
的值。
此外,我已经读过x += 1
在x
不是简单变量,而是涉及数组的表达式时非常有用。任何想法为什么会这样?
答案 0 :(得分:14)
为了给你一个“真实世界”的例子,请考虑这个程序:
int main()
{
int i = 0;
i += 1;
i++;
i = i + 1;
return 0;
}
使用以下标志在达尔文11中使用GCC进行编译:
-S
停在汇编程序-m32
到32位平台,只是为了简化一些事情除了我添加的注释和空行外,还会生成以下程序。请仔细阅读评论。
.section __TEXT,__text,regular,pure_instructions
.globl _main
.align 4, 0x90
_main:
pushl %ebp # cdecl function stuff
movl %esp, %ebp #
subl $12, %esp # get room for variables
movl $0, -12(%ebp) # i = 0;
; i += 1
movl -12(%ebp), %eax # load i in register a
addl $1, %eax # add 1 to register a
movl %eax, -12(%ebp) # store it back in memory
; i++
movl -12(%ebp), %eax #
addl $1, %eax # just the same
movl %eax, -12(%ebp) #
; i = i + 1
movl -12(%ebp), %eax #
addl $1, %eax # just the same
movl %eax, -12(%ebp) #
movl $0, -8(%ebp)
movl -8(%ebp), %eax
movl %eax, -4(%ebp)
movl -4(%ebp), %eax
addl $12, %esp
popl %ebp
ret
.subsections_via_symbols
答案 1 :(得分:12)
在大多数编译器中,这些都是相同的
答案 2 :(得分:7)
为什么x + = 1比x = x + 1更有效?
不是。
为什么x ++比x + = 1更有效?
不是。
当x += 1
被更长的标识符替换,或者可能是类或结构中的字段时,首选x = x+1
到x
的原因。在这种情况下,x += 1
版本更具可读性,更重要的是避免重复自己的陷阱。
答案 3 :(得分:3)
所以已经有一些问题涵盖了你在这里提出的问题:
Which is faster? ++, += or x + 1?
最重要的是,在大多数但不是所有语言中,编译器无论如何都会使它们相同,因此效率没有区别。上面的问题详细介绍了这个问题。
答案 4 :(得分:0)
使用gcc,您可以使用gcc -S foo.c
获取汇编程序代码。我尝试使用x += 1
和x = x + 1
并且它是一样的。
答案 5 :(得分:0)
因为它需要4个字符而不是5个字符。
这是x+=1
比x=x+1
“更有效”的唯一方法。但是,+=
运算符确实还有一些其他优点,例如(x)+=1
在宏中工作的事实x
是一个表达式,可能有副作用,您希望避免多次评估...