在一些特定的使用中, i++
可能将原值用中间量存起来以待使用,下面看相关程序的汇编代码(使用 gcc
)。
i++
源程序:
#include <stdio.h>
int main(){
int i = 1;
printf("%d\n", i++);
return 0;
}
i++
汇编:
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $1, -4(%rbp) //将i赋值为1.
movl -4(%rbp), %eax //将i的原值转移到中间变量
leal 1(%rax), %edx //将%edx赋值为i+1
movl %edx, -4(%rbp)//i的值改变
movl %eax, %esi //对原来i的值进行打印操作
leaq .LC0(%rip), %rax
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
再来看相同操作 ++i
++i
的源程序:
#include <stdio.h>
int main(){
int i = 1;
printf("%d\n", ++i);
}
++i
汇编:
main:
.LFB0:
.cfi_startproc
endbr64
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
subq $16, %rsp
movl $1, -4(%rbp) //对i进行赋值。
addl $1, -4(%rbp) //i的值加一。
movl -4(%rbp), %eax //对i的值进行打印操作。
movl %eax, %esi
leaq .LC0(%rip), %rax
movq %rax, %rdi
movl $0, %eax
call printf@PLT
movl $0, %eax
leave
.cfi_def_cfa 7, 8
ret
.cfi_endproc
笔者能力有限,如有失误,请多多见谅😊
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!