首页 > 其他分享 >“i++”是怎么工作的?

“i++”是怎么工作的?

时间:2024-08-19 16:29:08浏览次数:9  
标签:怎么 10 movl cfi ++ rbp 工作 eax

我们以下面这么一段代码开始

void test_inc() {
   int i = 10;
   i = i++;
   printf("i = %d\n", i);
}

运行输出

i = 10

看起来出乎意料,来我们看看他编译之后的汇编代码就明白了

test_inc:
.LFB20:
        .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    $10, -4(%rbp)
        movl    -4(%rbp), %eax
        leal    1(%rax), %edx
        movl    %edx, -4(%rbp)
        movl    %eax, -4(%rbp)
        movl    -4(%rbp), %eax
        movl    %eax, %esi
        leaq    .LC11(%rip), %rdi
        movl    $0, %eax
        call    printf@PLT
        nop
        leave
        .cfi_def_cfa 7, 8
        ret
        .cfi_endproc

可以看出i++的流程是这样的

R1 = i;

R2 = R1 + 1;

i = R2;

i = R1;

这就可以解释i的值最终没有变化。

所以编译器编译后产生的指令流程是先把+1后的值写回i,然后又把+1之前暂存在寄存器里的i的值赋值给i。i的值先变成11,然后又变回10了。

标签:怎么,10,movl,cfi,++,rbp,工作,eax
From: https://www.cnblogs.com/utopia007/p/18367560

相关文章

  • 辨析C++多态的概念
    1.什么是多态我们都知道面向对象语言的三大特性,封装,继承,多态;封装:封装就是将数据封装在一个类里面,提供对数据更好的管控;继承:继承就是类设计层次的代码复用。那多态是什么呢?多态是一种现象,这种现象要通过封装和继承才能实现。多态就是在同一继承体系下,不同的类的对象调用相同......
  • 深入理解C++多态
    目录一、引言二、多态的基本概念   1.定义   2.分类三、动态多态的实现原理   1.虚函数   2.虚函数表   3.动态绑定四、多态的应用   1.父类指针指向子类对象   2.纯虚函数与抽象类五、总结        本文将详细介绍C++多态的概念、......
  • c++ 命名空间别名踩坑
    c++命名空间别名踩坑遇到的问题在现代c++以前(c++11),实现别名的主要方式主要是通过typedef关键字实现的.今天写boost/asio代码的时候,遇到了这样的一个问题,催生了我的这篇文章加深我的印象.//我想写boost.asio中的内容,经常使用boost::asio::ip::xxxxxxx.//正是因为......
  • C++批量核验身份证真伪、实名认证接口、身份证识别
    实名认证接口是指一个系统或程序,它能够接收用户的个人信息(如姓名、身份证号码等),并与官方记录进行匹配以验证这些信息的真实性。这种接口可以集成到各种应用程序和服务中,以增强安全性并遵守相关法律法规的要求。批量核验身份证真伪以及进行实名认证是许多在线服务平台为了......
  • 在繁忙的编码生活中寻找平衡:高效工作与持续学习的艺术
    目录前言1.高效编码实践:提升工作效率的关键1.1代码复用与模块化设计1.2持续集成与自动化测试2.时间管理技巧:合理规划工作与学习时间2.1番茄工作法与专注力管理2.2时间块规划:分配专属的学习时间3.学习路径选择:广泛涉猎还是专注深入3.1广泛涉猎:适应多变的技术环......
  • Bug改不完,迭代总延期,项目又是倒排期怎么破局?
    前言随着互联网的兴起,版本交付越来越频繁,企业开始了敏捷转型、DevOps落地,项目组雄心勃勃,期望产品能按迭代快速交付。然而常见的现象是,到了迭代的最后一天,还有不少Bug来不及修复,迭代无法产生潜在可交付成果,延期成了必然。然后发现连续几个迭代都是这样,团队没有成就感,士气低落。迭......
  • 迪杰斯特拉(Dijkstra)算法(C/C++)
    迪杰斯特拉(Dijkstra)算法是一种用于在加权图中找到单个源点到所有其他顶点的最短路径的算法。它是由荷兰计算机科学家艾兹格·迪科斯彻(EdsgerDijkstra)在1956年提出的。Dijkstra算法适用于处理带有非负权重的图。迪杰斯特拉算法主要特点是从起始点开始,采用贪心算法,每次遍历到始......
  • windows更新在哪里打开,windows更新怎么打开?在哪打开
    下面Windows10为例,以在Windows10系统中,更新系统可以通过内置的“Windows更新”功能来完成,以下是详细的步骤和说明:一、通过设置界面更新Windows101.打开设置:点击屏幕左下角的“开始”按钮,选择“设置”(齿轮形状的图标),或者直接按下Win+I快捷键,快速打开“设置”应用。2.进......
  • VBA学习(48):利用ADO操作Excel工作表数据
    VBA可以利用ADO创建SQL,从而实现在不打开Excel工作簿的情况下,对工作表的数据进行读写等操作。对于数据量比较大的Excel工作簿,利用ADO模型可以大大提高性能。案例数据D盘有ExcelSQL数据库.xlsx工作簿,工作簿内有【员工信息】工作表,其字段包含工号、姓名、部门、性别和年龄。使......
  • 学懂C++(三十七):深入详解C++网络编程开发
            目录一、网络编程基础概念与原理1.1套接字(Socket)1.2IP地址和端口1.3TCP/IP协议二、C++网络编程核心技术2.1套接字编程2.1.1创建套接字2.1.2绑定地址2.1.3监听和接受连接2.1.4发送和接收数据三、C++网络编程高级技术3.1异步I/O3.2多线......