在K& R Ch 1:
语句
++nc
提供了一个新的运算符++
,表示递增1。您可以改为编写nc = nc + 1
,但++nc
更简洁,效率更高。
预增量何时比替代方案更有效?对于大多数事情,至少,两者的汇编是add
(编辑:或inc
)指令。它们何时不同?
答案 0 :(得分:10)
该文本已过时。在70年代,编译器可能会为++ n产生更高效的输出,但现在却不再如此。所有现代编译器都会生成相同的代码。
答案 1 :(得分:3)
对于大多数事情,至少,两者的程序集都是add指令。
这不完全正确:通常有separate "increment by one" instruction。但是,这是无关紧要的,因为任何半合半的编译器都会为++nc
和nc = nc + 1
生成相同的机器代码。
换句话说,没有性能差异。可能有这本书写的时候,编译器不是很好,但现在已经没有了。
答案 2 :(得分:2)
我不确定,我只是在大声思考(也许我不应该):也许在K& R的时候,++nc
被编译成比nc = nc + 1
更高效的东西。 (例如,增量指令,而不是加法)。然而,如今,编译器可能会自动优化它。
答案 3 :(得分:1)
这是我在gcc -S <filename>
看到的内容。我会让你得到你想要的东西!
>
> cat 1.c
#include <stdio.h>
int main()
{
int i=0;
++i;
return 0;
}
>
> cat 2.c
#include <stdio.h>
int main()
{
int i=0;
i++;
return 0;
}
>
> cat 3.c
#include <stdio.h>
int main(void)
{
int i=0;
i = i + 1;
return 0;
}
>
> gcc -S 1.c 2.c 3.c
>
>
> diff 1.s 2.s
1c1
< .file "1.c"
---
> .file "2.c"
>
> diff 2.s 3.s
1c1
< .file "2.c"
---
> .file "3.c"
>
> diff 3.s 1.s
1c1
< .file "3.c"
---
> .file "1.c"
>
>
以下是.s
的{{1}}文件的内容,与2.s和3.s相比,说明相同!
1.c
答案 4 :(得分:1)
对于“正常”变量,应该没有其他答案所暗示的差异。仅当nc
符合voloatile
时,结果才会有所不同。对于此类变量,+1
表单必须首先评估加载nc
的表达式nc
,然后执行添加。对于++
形式,编译器仍然可以使用快捷方式并将变量增加到位。