Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 与之间的差异+;=1和++;由计算机执行?_C++_Increment - Fatal编程技术网

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

C++ 与之间的差异+;=1和++;由计算机执行?,c++,increment,C++,Increment,在C++中,计算机对这两个表达式执行的命令是否相同: myInt += 1; myInt ++; 我应该使用GCC吗?或者,如果你知道答案,你能告诉我吗?对于许多编译器来说,它们是相同的。(请注意,我说过许多编译器-请参阅下面的免责声明)。例如,对于下面的C++代码,测试1和测试2都会产生相同的汇编语言: int main() { int test = 0; // Test 1 test++; // Test 2 test += 1; re

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

myInt += 1;
myInt ++;

我应该使用GCC吗?或者,如果你知道答案,你能告诉我吗?

对于许多编译器来说,它们是相同的。(请注意,我说过许多编译器-请参阅下面的免责声明)。例如,对于下面的C++代码,测试1和测试2都会产生相同的汇编语言:

int main()
{
    int test = 0;

    // Test 1
    test++;

    // Test 2
    test += 1;

    return 0;
}
; 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
许多编译器(包括VisualStudio)可以配置为显示生成的汇编语言,这是解决此类问题的最佳方法。例如,在Visual Studio中,我右键单击项目文件,转到“属性”,并执行以下操作:

在本例中,如下图所示,Visual Studio实际上将它们编译为相同的汇编语言:

int main()
{
    int test = 0;

    // Test 1
    test++;

    // Test 2
    test += 1;

    return 0;
}
; 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#与汇编语言的“等价物”),因此这显然也适用于多种语言

顺便说一句,如果您正在使用另一个编译器,如gcc,则可以按照说明获得汇编语言输出。根据已接受的答案,您应该使用
-S
选项,如下所示:

gcc -S helloworld.c
如果您是用Java编写的,并且想做类似的事情,那么可以使用
javap
来获取字节码,可以说字节码是Java与汇编语言的“等价物”

也有兴趣,因为这个问题最初是关于java和C++的,它讨论了java代码、字节码和最终的机器代码(如果有的话)之间的关系。


注意:不同的编译器可能会产生不同的汇编语言,尤其是在为不同的处理器和平台编译时。你是否开启了优化也会影响到事情。因此,严格地说,Visual Studio“足够聪明”知道这两条语句“意味着”同一件事的事实并不一定意味着所有可能平台的所有编译器都会那么聪明。

Java不会编译成汇编。它们的值不一样:例如
int a=myInt+=1
inta=myInt++
会导致
a
的不同值(前者类似于
++myInt
)。所以它们不会编译成相同的代码。为什么你认为你需要关心它们之间的差异?写可读代码,让运行时担心纳米优化。@ivomalinowskip-顺便问一下,是否有什么东西阻止您自己查看Java字节码?自己编译一些东西很容易,看看它们是否会产生不同的字节码。@jrook是的,在大多数情况下,字节码都会被编译,但这并不能保证——JVM的一些实现可以直接解释字节码,在这种情况下,不会有机器级指令。请参阅:-无论哪种方式,Java代码和最终机器代码之间的关系都是间接的,最好是特定于实现的。这个答案非常完整,非常好,谢谢。顺便说一句,你知道为什么我有这么多不喜欢的东西吗?如果提问者自己做一点调查,StackOverflow效果最好。因此,您可能会得到否决票,因为您根本没有查看汇编代码。投反对票是因为很难理解为什么你会问这样一个问题,这似乎是学术性的,与现实世界的问题无关。或者因为你一开始就把标签弄错了而投反对票。或者因为你的问题非常广泛而投反对票:你没有提到处理器架构,它在汇编程序中有很大的不同。所以你看,找到否决投票的理由并不难。