gpt4 book ai didi

c - 编译器实现中 x++ 和++x 的区别

转载 作者:太空宇宙 更新时间:2023-11-04 00:21:47 25 4
gpt4 key购买 nike

我搜索了 x++ vs++x,我找到了一个很好的答案 here ,所以我决定看gcc的汇编输出,看看x++和++x是如何实现的:

main() { int s = 0; ++s; return 0; }

编译示例:

gcc mul.c -masm=intel -o mul.asm

++s的输出:

    .file   "mul.c"
.intel_syntax
.text
.p2align 4,,15
.globl main
.type main, @function
main:
lea %ecx, [%esp+4]
and %esp, -16
push DWORD PTR [%ecx-4]
push %ebp
mov %ebp, %esp
push %ecx
sub %esp, 16
mov DWORD PTR [%ebp-8], 0
add DWORD PTR [%ebp-8], 1
mov %eax, 0
add %esp, 16
pop %ecx
pop %ebp
lea %esp, [%ecx-4]
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.1 20070719 [FreeBSD]"

x++ 的输出:

    .file   "mul.c"
.intel_syntax
.text
.p2align 4,,15
.globl main
.type main, @function
main:
lea %ecx, [%esp+4]
and %esp, -16
push DWORD PTR [%ecx-4]
push %ebp
mov %ebp, %esp
push %ecx
sub %esp, 16
mov DWORD PTR [%ebp-8], 0
add DWORD PTR [%ebp-8], 1
mov %eax, 0
add %esp, 16
pop %ecx
pop %ebp
lea %esp, [%ecx-4]
ret
.size main, .-main
.ident "GCC: (GNU) 4.2.1 20070719 [FreeBSD]"

所以,我想问 x++ 和++x 是否有不同的含义,为什么 GCC 为它们输出一些程序集,不应该有不同的输出?

最佳答案

这是一个写得不好的测试用例的例子。表达式 value++++value 的实际结果从不存储,因此编译器可以处理基本类型的两个等价物。

改用这个例子:

main() { int s = 0, x; x = ++s; return 0; }

main() { int s = 0, x; x = s++; return 0; }

后增量:

(gdb) disas /m mainDump of assembler code for function main():1       int main(){   0x0040138c :     push   %ebp   0x0040138d :     mov    %esp,%ebp   0x0040138f :     and    $0xfffffff0,%esp   0x00401392 :     sub    $0x10,%esp   0x00401395 :     call   0x4018d4 2               int s = 0;   0x0040139a :    movl   $0x0,0xc(%esp)3               int x;4               x = s++;   0x004013a2 :    mov    0xc(%esp),%eax   0x004013a6 :    mov    %eax,0x8(%esp)   0x004013aa :    incl   0xc(%esp)5               return 0;   0x004013ae :    mov    $0x0,%eax6       }   0x004013b3 :   leave   0x004013b4 :    retEnd of assembler dump.(gdb)

预增量:

(gdb) disas /m mainDump of assembler code for function main():1       int main(){   0x0040138c :     push   %ebp   0x0040138d :     mov    %esp,%ebp   0x0040138f :     and    $0xfffffff0,%esp   0x00401392 :     sub    $0x10,%esp   0x00401395 :     call   0x4018d4 2               int s = 0;   0x0040139a :    movl   $0x0,0xc(%esp)3               int x;4               x = ++s;   0x004013a2 :    incl   0xc(%esp)   0x004013a6 :    mov    0xc(%esp),%eax   0x004013aa :    mov    %eax,0x8(%esp)5               return 0;   0x004013ae :    mov    $0x0,%eax6       }   0x004013b3 :   leave   0x004013b4 :    retEnd of assembler dump.(gdb)

关于c - 编译器实现中 x++ 和++x 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12761379/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com