+ = 1和++之间的差异由计算机执行?

时间:2017-11-06 20:00:21

标签: c++ increment

计算机对C ++中这两个表达式执行的命令是否相同:

myInt += 1;
myInt ++;

我应该使用海湾合作委员会吗?或者如果你知道答案可以告诉我吗?

1 个答案:

答案 0 :(得分:2)

对于许多编译器,这些将是相同的。 (请注意,我说许多编译器 - 请参阅下面的免责声明)。例如,对于以下C ++代码,Test 1和Test 2都将生成相同的汇编语言:

int main()
{
    int test = 0;

    // Test 1
    test++;

    // Test 2
    test += 1;

    return 0;
}

可以配置许多编译器(包括Visual Studio)来显示生成的汇编语言,这是解决此类问题的最佳方法。例如,在Visual Studio中,我右键单击项目文件,转到" Properties",并执行以下操作: enter image description here

在这种情况下,如下所示,Visual Studio 确实,实际上是将它们编译为相同的汇编语言:

; Line 8
    push    ebp
    mov ebp, esp
    sub esp, 204                ; 000000ccH
    push    ebx
    push    esi
    push    edi
    lea edi, DWORD PTR [ebp-204]
    mov ecx, 51                 ; 00000033H
    mov eax, -858993460             ; ccccccccH
    rep stosd
; Line 9
    mov DWORD PTR _test$[ebp], 0
; Line 12 - this is Test 1
    mov eax, DWORD PTR _test$[ebp]
    add eax, 1
    mov DWORD PTR _test$[ebp], eax
; Line 15 - This is Test 2 - note that the assembly is identical
    mov eax, DWORD PTR _test$[ebp]
    add eax, 1
    mov DWORD PTR _test$[ebp], eax
; Line 17
    xor eax, eax
; Line 18
    pop edi
    pop esi
    pop ebx
    mov esp, ebp
    pop ebp
    ret 0
_main   ENDP
_TEXT   ENDS
END

有趣的是,它的C#编译器也为类似的C#代码生成了相同的MSIL(C#"#34;汇编语言的#34;),所以这显然也适用于多种语言。 / p>

顺便说一句,如果您正在使用其他编译器(如gcc),则可以按照here的说明进行汇编语言输出。根据接受的答案,您应该使用-S选项,如下所示:

gcc -S helloworld.c

如果您正在使用Java编写并希望执行类似的操作,则可以按照these directions使用javap来获取字节码,即Java"&#34 ;等效"汇编语言,可以这么说。

同样有趣的是,由于这个问题最初是关于Java和C ++的问题,this question讨论了Java代码,字节码和最终机器代码(如果有的话)之间的关系。

警告:不同的编译器可能会产生不同的汇编语言,尤其是在您为不同的处理器和平台进行编译时。您是否启用了优化也会影响事物。所以,严格来说,Visual Studio已经足够聪明了#34;知道那两个陈述"意思是"同样的事情并不一定意味着所有可能平台的所有编译器都会那么聪明。