前++与后++的区别?反汇编底层刨析

news2024/9/22 19:41:13

目录

1.只++,不赋值

2.++和其他运算符的结合

1.后置++(i++)

2.前++(++i)

总结


1.只++,不赋值

前置++和后置++无区别,效果一致,i++ -> i=i+1

反汇编语言内,对a++和++b的操作进行观察:

  • a的值移动到eax
  • add 将eax的值加1
  • exa的值移动到a内

b同理。 

2.++和其他运算符的结合

预备知识:

’++‘的优先级高于赋值运算符‘=’

‘++’优先级高于‘&’

以    i++ =1;

        ++i =1;   为例

1.后置++(i++)

先取值再加加

  1. 先取出 i 的值
  2. 1赋值给取出的 i (将亡值)
  3. 对 i 进行++

2.前++(++i)

  1. 先取出 i 的值
  2. 对取出的i++
  3. 把取出的值回写到 i 内
  4. 1赋值给 i(非将亡值)

在反汇编内查看:

执行以下程序,跳转到反汇编语言内进行查看

 

 

 

由此可见,

在前置++内(i=++a)

  • a的值给eax
  • 对eax+1
  • eax的值给a
  • ------------------------
    • 这三步内把a的值回写给a:
    • 先++ 后赋值
  • ------------------------
  • a的值给ecx
  • ecx的值给i

 在后置++内(i=b++)

  • b的值给eax
  • eax的值给i
  • ------------------------
  • b的值给ecx
  • exc+1
  • ecx的值给b

先赋值 再++

那么再来看下面的这种写法为什么不对?

        ++a = 10; 这样是正确的,根据上面所述,前++是把a取出来放在寄存器内先++,然后再把10赋值给a

        但是 b++=10;这样是错误的,因为b++属于后置++,后置++是先赋值再++,如果先赋值的话就是把10赋值给b所在的寄存器临时空间内,并未赋值给b本身是不合法的(前置有个回写的过程,后置没有)

同理,我们可以&++a,但不是可以&b++,因为前置++本身就是a本身,可以对a取地址,而后置b++是先把临时量b取出来然后对临时量进行取地址&,是不合法的

总结

  • 单独++不和其他运算符结合时,前置和后置一样
  • 当和其他运算符结合时
    • 前置++是先++后赋值,a=1; i=++a;//a=2,i=2;
    • 后置++是先赋值再++ ,a=1; i=a++;//a=2,i=1;
    • 前置++可以做左值,后置不可以
    • 前置可以取地址&,后置不可以

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/447448.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

彻底卸载Anaconda和PyCharm详细教程

目录 一、卸载Anaconda 二、 卸载PyCharm 一、卸载Anaconda 1、在开始处打开Anaconda Prompt 2、打开后,输入conda install tqdm -f命令并按回车键 conda install tqdm -f 3、之后页面会出现一个WANNING,这个我们不用在意,然后会出现一个…

GitHub新手用法详解【适合新手入门-建议收藏!!!】

目录 什么是Github,为什么使用它? 一、GitHub账号的注册与登录 二、 gitbash安装详解 1.git bash的下载与安装 2.git常用命令 3. Git 和 GitHub 的绑定 1. 获取SSH keys 2.绑定ssh密钥 三、通过Git将代码提交到GitHub 1.克隆仓库 2.测试提交代码…

ClickHouse同步MySQL数据

目录 1 概述1.1 特点1.2 使用细则 2 案例实操2.1 MySQL 开启 binlog 和 GTID 模式2.2 准备 MySQL 表和数据2.3 开启 ClickHouse 物化引擎2.4 创建复制管道2.5 修改数据2.6 删除数据2.7 删除表 1 概述 MySQL 的用户群体很大,为了能够增强数据的实时性,很多…

通过response.body()返回的json报文,直接生成对应结构体,实现数据绑定

作者:非妃是公主 专栏:《Golang》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录 序一、解决办法二、相关测试代码1. json body…

Origin选取一定间隔的数据点并作图

有些时候我们发现用origin绘制的图数据点太密,抖动太剧烈: 所以我们最好是隔几个点采样一次,方法如下。 假如我们一共有五列数据,我们再扩充六列(其中一列是放隔点采样的横坐标): 然后选中扩充…

Java企业级开发学习笔记(2.4)利用MyBatis实现条件查询

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/AZM1g】 文章目录 一、创建学生映射器配置文件二、配置学生映射文件三、创建学生映射器接口四、测试学生映射器接口任务1. 查询女生记录任务2. 查询19岁的女生任务3. 查询姓吴的19岁女生任务4. 查…

css预处理器:less

1.css常见单位 绝对单位 只需要掌握px,国外in用得更多 相对单位 em em相对于自身的font-size,如果自身未定义,则相对于继承的父元素font-size rem rem可以做移动端的适配,依然很重要,如淘宝m站在使用;但是趋势是rem转vw rem是相对于html的font-size,html默认字体大小为1…

ROS学习第二十五节——rqt工具箱

1.安装 一般只要你安装的是desktop-full版本就会自带工具箱 如果需要安装可以以如下方式安装 $ sudo apt-get install ros-noetic-rqt $ sudo apt-get install ros-noetic-rqt-common-plugins2.启动 rqt的启动方式有两种: 方式1:rqt 方式2:rosrun rqt_gui rqt_gui 3.基本使…

知识图谱实战应用5-基于知识图谱的创建语义搜索功能

大家好,我是微学AI,今天给大家讲一下知识图谱实战应用5-基于知识图谱的创建语义搜索功能。基于知识图谱的语义搜索功能是一种能够理解用户意图、并根据语义关系在知识图谱中进行查询的搜索方式。相比于传统的文本搜索,它可以更准确地回答用户…

Ubuntu 23.04 正式发布

Ubuntu 23.04 “Lunar Lobster” 是 Ubuntu 操作系统的最新短期支持版本,该版本将获得 9 个月的支持,直到 2024 年 1 月。如果你需要长期支持,建议使用 Ubuntu 22.04 LTS 代替。 Linux 内核 Ubuntu 23.04 采用了新的 Linux 6.2 内核。 值得注…

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题,这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决: 对 PySide6/PyQT 多线程的使用不熟悉;在 PySide6/PyQT 的应用程序里有耗时任…

prompt的演变

随着功能的增加,提示工程的复杂性将不可避免地增加。在这里,我解释了如何将复杂性引入到提示工程的过程中。 静态prompt 如今,试验prompt和提示工程已司空见惯。通过创建和运行提示的过程,用户可以体验 LLM 的生成能力。 文本生…

STM32 学习笔记_4 GPIO:LED,蜂鸣器,按键,传感器的使用

GPIO 通用 IO General Purpose Input Output. 可配置为8种输入输出模式。通常0~3.3V,部分引脚允许 5V。 上面的虚线方框是输入模块,下面的是输出模块。 推挽输出是1输出高电平,0输出低电平。开漏输出正好相反,因此没有高电平驱…

10分钟了解人工智能(最通俗的语言)

最通俗的语言:15分钟了解人工智能;唯一优点,受众完全听懂 无人驾驶、智能家居、远程医疗……如今,人工智能(AI)技术已被广泛应用于金融、交通、医疗、安防、教育等领域,成为经济增长新动能 一 什么是人工智能 人工智能…

动态规划之-不同路径 II-滚动数组_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中,从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度,更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用,在常规的动态规划中&#xff0…

REDIS02_RDB概述及作用、自动触发、手动触发、优势劣势、触发场景、配置项详解

文章目录 ①. RDB概述及作用②. RDB - 自动触发③. 手动触发 - save、bgsave④. RDB - 优势体现⑤. RDB - 劣势体现⑥. 哪些情况会触发RDB快照⑦. RDB优化配置项详解 ①. RDB概述及作用 ①. RDB概述:在指定的时间间隔,执行数据集的时间点快照 实现类似照片记录效果的方式,就是…

MapReduce高级篇——全局计数器

MapReduce Counter 计数器 概念 在执行MapReduce程序的时候,控制台输出日志中通常下面片段,可以发现输出信息中的核心词是counter,中文叫做计数器 在执行MapReduce城西过程中,许多时候,用户希望了解程序的运行情况,H…

白话文讲计算机视觉-第十讲-灰度阈值分割

灰度阈值是啥意思呢?我们慢慢说。 1.灰度图 我们现在有一张彩色图,我们给它用黑白的方式变现,就形成灰度图,如图所示。 图1 那究竟怎么转换的呢?很简单,我们根据如下公式,把BGR三个通道换成一个…

【算法题解】26. 求串联子串的位置

这是一道 困难 题 来自: https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的…

REXROTH液压方向阀安装须知

安装规程 阀安装到系统之前,应该对照订货型号比较其型号说明。 确认阀的连接表面和底板无水分,没有油。 - 清洁: ‧ 安装元件时,确认工业阀和周围干净 ‧ 油箱须密闭,以防止外部污染 ‧ 安装之前&…