++ nc vs nc = nc + 1

时间:2011-12-23 09:00:12

标签: c pre-increment

在K& R Ch 1:

  

语句++nc提供了一个新的运算符++,表示递增1。您可以改为编写nc = nc + 1,但++nc更简洁,效率更高。

预增量何时比替代方案更有效?对于大多数事情,至少,两者的汇编是add(编辑:或inc)指令。它们何时不同?

5 个答案:

答案 0 :(得分:10)

该文本已过时。在70年代,编译器可能会为++ n产生更高效的输出,但现在却不再如此。所有现代编译器都会生成相同的代码。

答案 1 :(得分:3)

  

对于大多数事情,至少,两者的程序集都是add指令。

这不完全正确:通常有separate "increment by one" instruction。但是,这是无关紧要的,因为任何半合半的编译器都会为++ncnc = 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,然后执行添加。对于++形式,编译器仍然可以使用快捷方式并将变量增加到位。