a++和++a的问题

printf 中的a++,++a printf和a++,++a, a--, --a 阅读详情

让c语言和c++中的“a++,++a”永远不是问题

这里主要研究一下c语言和c++中的a++,++a
有分双操做数和多操做数之分
双操做数:
在语言中定义a++是先用后加,++a是先加后用。
实际上对双操做数来说的是在一个语句中结束前加和后加的问题 。
即如k=(++a)+(a++);
a++是语句结束后在后加,
++a是先加后计算再语句结束。

我举几个例子(用反汇编说明)
1 int k=2;
int val=0;
val=(k++)+(k++);

反汇编
8: int k=2;
00401028 mov dword ptr [ebp-4],2//// k的地址是dword ptr [ebp-4]
9: int val=0;
0040102F mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8]
10: val=(k++)+(k++);
00401036 mov eax,dword ptr [ebp-4]// 把2放入eax中
00401039 add eax,dword ptr [ebp-4]// 把2+2=4放入eax中
0040103C mov dword ptr [ebp-8],eax//把eax中的4移回val中
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,1//
00401045 mov dword ptr [ebp-4],ecx//k地址中的值加1,k=3

00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,1// 寄存器中的值加1,k=4
0040104E mov dword ptr [ebp-4],edx//移回k地址

结论:val=*( dword ptr [ebp-8])=4;k=4

2. int k=2;
int val=0;
k=(k++)+(k++);

反汇编
:
8: int k=2;
00401028 mov dword ptr [ebp-4],2//同上
9: int val=0;
0040102F mov dword ptr [ebp-8],0
10: k=(k++)+(k++);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,dword ptr [ebp-4] //同上
0040103C mov dword ptr [ebp-4],eax//同上,不同的是计算结果存入k地址k=4
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,1//寄存器中的值加1,
00401045 mov dword ptr [ebp-4],ecx//k=5
00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,1//寄存器中的值加1
0040104E mov dword ptr [ebp-4],edx//k=6

结论:k=*( dword ptr [ebp-4])=6;

3 int k=2;
int val=0;
val=(++k)+(++k);

反汇编:
8: int k=2;
00401028 mov dword ptr [ebp-4],2// k的地址是dword ptr [ebp-4]
9: int val=0;
0040102F mov dword ptr [ebp-8],0//val的地址是dword ptr [ebp-8]
10: val=(++k)+(++k);//k先加
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,1//寄存器中的值加1

0040103C mov dword ptr [ebp-4],eax//k=3
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,1//对k地址中的值加1,k=4
00401045 mov dword ptr [ebp-4],ecx
00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,dword ptr [ebp-4]//k+k=8
0040104E mov dword ptr [ebp-8],edx//值移入val地址中val=8

结论:val=*( dword ptr [ebp-8])=8;k=4
4. int k=2;
int val=0;
k=(++k)+(++k);
反汇编:
8: int k=2;
00401028 mov dword ptr [ebp-4],2
9: int val=0;
0040102F mov dword ptr [ebp-8],0
10: k=(++k)+(++k);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,1
0040103C mov dword ptr [ebp-4],eax
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,1
00401045 mov dword ptr [ebp-4],ecx
00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,dword ptr [ebp-4]///以上同3例
0040104E mov dword ptr [ebp-4],edx// 值移入k地址k=8
结论:k=*( dword ptr [ebp-4])=8;

5. int k=2;
int val=0;
val=(++k)+(k++);

反汇编:


8: int k=2;
00401028 mov dword ptr [ebp-4],2
9: int val=0;
0040102F mov dword ptr [ebp-8],0
10: val=(++k)+(k++);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,1
0040103C mov dword ptr [ebp-4],eax//k=k+1=3
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,dword ptr [ebp-4]//k+k=6
00401045 mov dword ptr [ebp-8],ecx//val=6
00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,1//k=k+1=4
0040104E mov dword ptr [ebp-4],edx

结论:val=*( dword ptr [ebp-8])=6;k=4

6. int k=2;
int val=0;
k=(++k)+(k++);

反汇编:

8: int k=2;
00401028 mov dword ptr [ebp-4],2
9: int val=0;
0040102F mov dword ptr [ebp-8],0
10: k=(++k)+(k++);
00401036 mov eax,dword ptr [ebp-4]
00401039 add eax,1//k+1
0040103C mov dword ptr [ebp-4],eax//k=3
0040103F mov ecx,dword ptr [ebp-4]
00401042 add ecx,dword ptr [ebp-4]//k+k=6
00401045 mov dword ptr [ebp-4],ecx//k=6
00401048 mov edx,dword ptr [ebp-4]
0040104B add edx,1
0040104E mov dword ptr [ebp-4],edx//k=k+1=7

结论:k=*( dword ptr [ebp-4])=7;k=7

多操做数

多操做数(>2)头两个操做数同以上(中间值)而后面的数如是(++i)加1
如是(i++)不加1。赋值给变量如果不是本身则结束
如果是本身则要数(i++)个数如是n加n
举几个例子
1.
int k=2;
int val=0;
val=(k++)+(k++)+(++k);

反汇编:

331: int k=2;
00407488 mov dword ptr [ebp-14h],2
332: int val=0;
0040748F mov dword ptr [ebp-18h],0
333: val=(k++)+(k++)+(++k);
00407496 mov eax,dword ptr [ebp-14h]
00407499 add eax,dword ptr [ebp-14h]//以上同双操做数中间数存在eax中eax=4,k=2
0040749C mov ecx,dword ptr [ebp-14h]
0040749F add ecx,1
004074A2 mov dword ptr [ebp-14h],ecx//k=3
004074A5 add eax,dword ptr [ebp-14h]//eax+k=
004074A8 mov dword ptr [ebp-18h],eax//赋值给val=eax+k=7
004074AB mov edx,dword ptr [ebp-14h]
004074AE add edx,1
004074B1 mov dword ptr [ebp-14h],edx
004074B4 mov eax,dword ptr [ebp-14h]
004074B7 add eax,1
004074BA mov dword ptr [ebp-14h],eax

结论:val=*( dword ptr [ebp-18h])=6;k=5

2.
int k=2;
int val=0;
k=(k++)+(k++)+(++k);
反汇编:


331: int k=2;
00407488 mov dword ptr [ebp-14h],2
332: int val=0;
0040748F mov dword ptr [ebp-18h],0
333: k=(k++)+(k++)+(++k);
00407496 mov eax,dword ptr [ebp-14h]
00407499 add eax,dword ptr [ebp-14h]
0040749C mov ecx,dword ptr [ebp-14h]
0040749F add ecx,1
004074A2 mov dword ptr [ebp-14h],ecx
004074A5 add eax,dword ptr [ebp-14h]
004074A8 mov dword ptr [ebp-14h],eax//赋值给k=eax+k=7
004074AB mov edx,dword ptr [ebp-14h]
004074AE add edx,1
004074B1 mov dword ptr [ebp-14h],edx//k=k+1=8
004074B4 mov eax,dword ptr [ebp-14h]
004074B7 add eax,1
004074BA mov dword ptr [ebp-14h],eax//k=k+1=9

结论:val=*( dword ptr [ebp-14h])=9;

举个题
1.
int k=2;
int val =0;
val=(++k)+(++k)+(k++)+(++k) +(++k) +(++k) +(++k) +(k++)+(k++)+(k++);
val=4 + 4 +4 +5 +6 +7 +8 +8 +8 +8= 62

2.
int k=2;
int val =0;
k=(++k)+(++k)+(k++)+(++k) +(++k) +(++k) +(++k) +(k++)+(k++)+(k++);
4个k++
k=4 + 4+ 4 +5 +6 + 7 + 8 +8 +8 +8 在加 4=66


"a--,--a"与++a,a++相同.

 

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践 本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。 阅读详情

相关推荐

SpringBoot Actuator未授权访问漏洞实战:从发现到利用

本文深入剖析了SpringBoot Actuator未授权访问漏洞的成因、危害与利用手法。文章详细演示了如何发现暴露的端点,并通过实战案例复现了从敏感信息泄露到利用反序列化漏洞实现远程代码执行(RCE)的全过程,为开发与运维人员提供了从漏洞发现到修复加固的完整安全指南。

weixin_29231221的博客 259

c语言中a++和++a有什么区别_a+++a和a+a++结果为什么不一样

首先为大家举两个栗子引出今天的问题:let a = 1 console.log(a+++a) //输出3 let a = 1 console.log(a+a++) // 输出2 那么造成这两个结果差异的原因是什么呢?这就涉及到自增运算符 a++和++a的区别以及运算符的优先级了。首先为大家解释a++和++a的区别:let a = 1 console.log (b = ++a) // 输出结果为2...

weixin_29199873的博客 3319

编译opencv4.2时出现undefined reference to `jpeg_default_qtables‘错误的解决方案

操作系统:kylinV10 opencv版本:4.2.0 在编译opencv4.2.0的版本时,出现undefined reference to `jpeg_default_qtables’的错误提示,导致openc编译中断,不能继续编译,所以这个错误必须解决。 解决方案 查看错误的名字,根据名字分析,很有可能是当前系统中没有安装jpeg第三方库,到 http://www.ijg.org/上下载最新的源码包 jpegsrc.v9e.tar.gz,按如下顺序开始编译安装: tar -xzvf jpegsr.

jndingxin的专栏 5105

C/C++语言中的自增(自减)运算符

1.为什么会出现自增运算符? 原因: (1)可以使代码更加简练。但是,这也会使代码的可读性变差。例如: #include void main() { int x = 5; printf("%d\n", (++x) + (++x) + (++x)); } (2)自增运算符可以使自增运算更加高效。语句i = i +1;将会涉及内存存取操作,而i++可以再寄存器中进行,

工作学习记录 2366

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。

用友T3提示,年度[UFDATA_002_2017]并不存在,导致无法备份迁移。现在都win11了某个年度账套不存在怎么办?

雨季余静的博客 3561

【HALCON 25.11 + C#】 01:2026年工业机器视觉实战详解(从入门到精通)

2026年机器视觉市场规模将突破230亿美元,HALCON 25.11的革命性更新与C#的工业集成优势形成黄金技术栈。本文作为付费专栏开篇序章,聚焦“为什么现在必须学25.11+C#”的核心问题,通过真实工业案例、五项核心技术突破、联合编程架构优势及30篇系统学习路线,全方位论证其投资价值。读者将掌握持续学习、深度OCR加速等关键技能,获得可直接上产线的工业级代码资产与架构设计思维,解决柔性生产、边缘部署等核心痛点,成为具备技术溢价的机器视觉工程师。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1216

浅谈C++中的buffer

一、C++中buffer是什么?1、buffer就是缓冲区的意思。当数据从其他地方接受过来在处理前,先保存至缓冲区,然后进行发送,主要用于处理能力或效率不相同的两个设备之间进行协调。2、buffer一般用来定义数组,因为它本身的意思就是“缓冲区”,在C语言里,数组就是个缓冲区,所以用常常用它。用它没有别的意思,就是方便记,可以用shuzu mydata甚至自己名字的拼音都行,主要是用它别人也很容易...

爱学习的影峰的博客 2万+

PCL 基于法线微分(DoN)的点云分割【2026最新版】

基于法线微分的分割。博客长期更新,本文最新更新时间为:2026年5月10日。

点云侠的博客 39万+

常见表达式语句的反汇编(x86)

我学习逆向,整理的VC6编译出来表达式语句一些常见的反汇编笔记。由于我是新手,肯定有一些疏漏不完善的,我遇到了会实时更新的。 整数 赋值 5: int a = 1; 0040102E mov dword ptr [ebp-4],1 6: int b = 2; 00401035 mov dword ptr [eb

菜鸟无影的学习笔记 1057

工程级 RK3588 YOLOv5 Android 架构拆解:NPU 量化优化 + 多线程推理 + 跟踪算法源码

本文将带你完成一个完整的AI视觉项目:在搭载RK3588芯片的Android开发板上运行实时目标检测与跟踪应用。实战目标:成功运行官方YOLOV5摄像头实时检测案例技术深度:深入理解RKNN开发框架和源码实现核心技能:掌握NPU推理、多线程并发、目标跟踪等关键技术。

LXY_LOVE36的博客 128

【目标检测】IoU(交并比)详解及代码实现

1. IOU概述        IoU的全称为交并比(Intersection over Union),是目标检测中使用的一个概念,IoU计算的是“预测的边框”和“真实的边框”的交叠率-,即它们的交集和并集的比值。最理想情况是完全重叠,即比值为1。 2. IoU计算        IoU等于“预测的边框”和“真实的边框”之间交集和并集的比值。IoU计算如下图,B1为真实

Roaddd的博客 2万+

【汇编 C++】C++this指针、this指针长什么样?

this指针是“C++封装后的结构体或类中成员函数”的一个默认参数,用于存放当前结构体变量(类的对象)的首地址,它是一个隐藏的参数。概念听起来很模糊,不急,代码测试之后就能明白。{int a;int b;int c;};// 结构体的外部定义函数{}int main(){// 此处下断点,观察反汇编return 0;}我们先把函数定义在结构体的外部,现在的结构体就是个简单的结构体,没有进行封装,函数也是个简单的函数,没有this指针。

qq_52572621的博客 1081

铁路场景雷达点云目标识别与追踪系统

本文介绍了一种基于毫米波雷达的铁路货运车站安全监控系统。该系统采用分布式架构,通过多个毫米波雷达节点采集点云数据,经过坐标转换、多雷达融合等处理后,利用机器学习算法实现列车、行人等目标的实时识别与追踪。系统包含数据采集层、处理层、目标识别层、追踪层、预警决策层和可视化层,能够克服传统视频监控受环境影响大的缺点,实现全天候可靠监测。文中详细展示了雷达数据解析和点云预处理的代码实现,包括坐标转换、数据格式解析和体素网格滤波等关键技术。该系统可有效预警铁路场景下的碰撞风险,提升货运车站的安全管理水平。

huanghm88的专栏 125

a++和++a左值问题

a++和++a,前缀和后缀哪一个可以作为左值,这个问题让我忙活了很久,终于有了些许突破。 a++和++a在做左值的时候有不同,那么左值它首先必须是有特定地址的才能作为左值,否则赋值就没有具体对象。再看看a++和++a。a++的意思是先复制一份临时数据出来参与周边环境的运算,再自加变量a,可见a++用来参与运算的是一份复制出来的临时数据,这个数据是临时存在而没有固定地址的,不是一个真正的变量。++

若海人生的专栏 2291

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

区分a++和++a,浅谈两者的效率问题

区分a++和++a,浅谈两者的效率问题

weixin_56916549的博客 1073

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

++a和a++的相关问题

int a=1;int b,c;b=(a++)+(a++)+(a++);//计算结果:b=3,a=4int a=1;c=(++a)+(++a)+(++a);//计算结果:c=10,a=4为什么c=10呢?结果与编译器有关,gcc得出的结果也是10。下面是一个测试的源代码:int main(int argc, char argv[]){  int a = 1;  int b,c;    b = (a

sttypxx520的专栏 1897

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

java中a++和++a的问题

情况一: 所以 情况二: 所以可以得出当一个变量参与多种运算就会生成一个临时变量。如何看是否参与了多种运算,从变量往左看,如果只参与了一种就运算完后接下下一种运算或者语句。 第一个a++,a这个变量既参与了System.out.println()语句,又参与了++,所以会产生临时变量,把1保存起来,所以输出的是1。而++b,只参与了++,不产生临时变量,所以b为2,输出2。 ...

qq_33400959的博客 453

( ++a )和( a++ )相关顺序问题

/* 这个例子主要是考虑到a++和++a的存储问题; 我们知道,对于a++是先将a给表达式再++; 那么这就是需要一个tmp空间来保存++之前 的a!!!但是对于++a是不需要的,因为先 执行++,那么就是直接改a空间内容就好了! 那么我们下面的问题就是这样! */ #include <stdio.h> int main() { int a = 4; /...

one-way or another 652

a++和++a 左值不可以赋值问题

      这个例子主要是考虑到a++和++a的存储问题; 我们知道,对于a++是先将a给表达式再++; 那么这就是需要一个tmp空间来保存++之前的a!!!但是对于   ++a是不需要的,因为先执行++,那么就是直接改a空间内容就好了!那么我们下面的问题就是这样!        int a = 4;   一、       a += ( a++ );                   ...

C++初学者 1304

关于C语言中a++和++a的问题

查看camera驱动中有一些自增变量,一直混淆。这次自测并mark一下。           总结一句话:(a++)(++a)总体的值都会+1。区别在于a++对a的值先进行操作后进行自增,而++a先进行自增运算,后进行赋值运算。同理a-- 与--a。

super-H 1115

C语言—关于自增( a++和 ++a )的一些问题

网上很多朋友老是搞不懂a++和++a的区别,老是弄错,对于初学者也很纠结,,那是因为没有总结,,总因为这样就是累加,但是却忽略了它的规律。 下面我就总结一下这两者之间的规律,因为自减a——和——a跟自增的道理一样,这里只介绍自增 首先大家要记住一句口诀: “++a,加号在前,先加后用; a++,a在前,先用后加” 口诀...

weixin_30896763的博客 366

三目运算符的理和a++和++a计算过程性问题

三目运算符的理和a++和++a计算过程性问题 1、三目运算符的理解问题: b ? x : y 表示的意思是:如果b为真,计算x的值,运算结果为x的值;如果b为假,计算y的值,运算结果为y的值. 三目运算符是右结合性的,比如b ? x : y ? c : d所表示的意思是 b ? x : ( y ? c : d ). 2.a++和++a计算过程性问题 ​ ++a与a–,有两种使用情况: ​ 一种是前面有变量进行赋值的情况; ​ 一种是前面没有变量,出现在某些计算过程中的情况. ​

ahahayaa的博客 907

关于自增运算符++a和a++的问题

这个问题比较的麻烦,通常考虑这些问题的是需要参加计算机笔试考试的人,因为通常我们在项目中不会使用这种容易混淆的东西.解决这个问题我们首先需要知道下面的两句话a++ 先取a的值后运算a的值 ++a 先运算a的值后取a的值如果你记住了上面两个定理我们来看看这两段代码:int a = 0;Console.WriteLine(++a);上面这段代码的运行结果是1.int

flamelp(翔天)的专栏 1280

一道题解决a++和++a问题

问最后a,b,c各等于多少。

2301_79681215的博客 198

java数组赋值运算时自增自减的问题——a[t] = tmp[t++]和a[t++] = tmp[t]的区别

问题的发现: 在手写归并排序中,写到对原数组进行更新赋值的时候,把t++放在了被赋值数组里面。如图。结果发现程序报数组下标越界了,当把t++放在赋值数组里时,程序就正常运行。 分析 我们都知道,t++中,++放在后面,表示先执行表达式,再执行自增操作。按道理讲 a[t] = tmp[t++]和a[t++] = tmp[t] 应该都是 先执行:a[t] = tmp[t]; 再执行:t++; 结果应该是一致的才对,但是上面问题告诉我们,他们并不一样,于是抱着探究到底的精神,我用 javap -c xxx.

Sendren的博客 1094

卡码网KamaCoder C++基础课 A+B问题②

注意,测试数据不仅仅一组。也就是说,会持续输入N以及后面的a和b。第一行是一个整数N,表示后面会有N行a和b,通过空格隔开。对于输入的每对a和b,你需要在相应的行输出a、b的和。关键知识点:i++,++i 作为判断条件的区别使用。如第二对a和b,对应的和也输出在第二行。计算a+b,但输入方式有所改变。

nichhb的博客 461
上一篇: ADSL速度的问题
下一篇: this is test
52bb
博客等级 码龄22年 8粉丝 19原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值