执行速度方面n/=10
和n=n/10
之间有什么区别吗?
就像n--
和--n
执行速度明显不同......
答案 0 :(得分:5)
不,不是真的:
[C99: 6.5.16.2/3]:
E1 op= E2
形式的复合作业与简单作业表达式E1 = E1 op (E2)
的不同之处仅在于左值E1
仅评估一次。
因此,只有当你的n
是带有副作用的非平凡表达式(例如函数调用)时,才会产生这种后果。
否则,我认为理论上会涉及一个中间临时变量,但是你必须非常不幸的是这样一个临时变量才真正存在于你编译的可执行文件中。你不会发现这两种方法之间存在任何性能差异。
使用基准确认,并比较生成的装配。
答案 1 :(得分:2)
给出以下C代码:
int f1(int n) {
n /= 10;
return n;
}
int f2(int n) {
n = n / 10;
return n;
}
使用gcc -O4
编译的基本上会导致
f1:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
f2:
movl %edi, %eax
movl $1717986919, %edx
sarl $31, %edi
imull %edx
sarl $2, %edx
subl %edi, %edx
movl %edx, %eax
ret
我省略了一些样板,它是实际列表中的一部分。
在这种特定情况下,两种选择之间没有区别。
根据所使用的编译器,在执行指令的实际环境和编译器优化级别上,生成的代码可能不同。但是,您始终可以使用此方法检查生成的机器代码是否有所不同。
答案 2 :(得分:0)
两者没有区别。
答案 3 :(得分:-2)
我已经在KEIL交叉编译器中检查了两个表达式和所需的相同执行时间:
=================================================
5: x=x/5;
6:
C:0x0005 EF **MOV A,R7**
C:0x0006 75F005 **MOV B(0xF0),#0x05**
C:0x0009 84 **DIV AB**
7: x/=5;
C:0x000A 75F005 **MOV B(0xF0),#0x05**
C:0x000D 84 **DIV AB**
C:0x000E FF **MOV R7,A**
================================================
因此,没有任何区别,例如--n
和n--
。