深入理解自增自减运算符,看懂表达式不糊涂

2023-11-05

自增运算符(++)和自减运算符(- - )在算术表达式中容易造成使用上的错误,主要原因有两点:一是自增运算符和自减运算符在变量前后的位置不一样,其内部逻辑不一样。二是自增运算符和自减运算符只能用于变量,不能用于常量。

  • 首先讲解一下自增自减运算符的概念,自增自减运算符存在于高级语言中,它的作用是在运算结束前(前置自增自减运算符)或后(后置自增自减运算符)将变量的值加(或减)一。
  • 对于第一点原因,我们需要了解计算机编译程序对表达式的处理过程。编译程序对表达式的处理,需要借助栈来完成,栈的特点是先进后出,计算机 从左向右扫描表达式,对于后置自增或自减运算符,先将操作数压入栈中,然后再进行自增后自减操作,在进行运算时将压入栈中的数弹出来进行运算,而前置的自增或自减运算符相反,是先将操作数进行自增或自减操作,然后再压入栈中,运算时将栈中的数弹出进行计算。举例如下:
 int a = 1;
 int b = 2;
 int c = 0;
 c = a++ + b++ + ++a;
 system.out.println("a="+a+",b="+b+",c="+c);

运行结果a=3,b=3,c = 6.
分析过程如下:
第一步:从左向右扫描表达式,遇到a++,将a = 1压入栈中(即栈中存储的数值为1,在计算时弹出的值为1),a加1,此时a = 2。
第二步:继续扫描,遇到b++,将b=2压入栈中(即栈中存储的数值为2,在计算时弹出的值为2),b加1,此时b=3。
第三步:继续扫描,遇到++a,由于在第一步中a已经变成2,此时先自增,a=3,压入栈中(即栈中存储的数值为3,在计算时弹出的值为3)。
第四步:进行计算,将压入栈中的数依次弹出,分别是a=3,b=2,a=1,计算可得c=1+2+3=6,此时a=3,b=3.
再举一个例子:

int a = 1;
a = a++;
 system.out.println("a="+a);

可能有的人会认为输出结果为a = 2,这是错误的,a的值为1,我们对表达式进行分析,扫描表达式,遇到a++,将a=1压入栈中,此时a自增,变为2,进行计算,将栈中的1弹出,赋值给a,此时a的值仍然为1。
通过上面的例子分析应该可以清晰的看懂自增自减运算符在表达式中的处理过程。

  • 对于第二点原因,自增自减运算符只能用于操作数是变量的情况,不能用于常量的情况,例如:
#define PI 3.1415926
 PI++

这种情况是错误的,再比如:3++,这种情况同样是错误的。

本人水平有限,如有不足之处欢迎各位指正,或者有疑问的可以在评论区提出。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

深入理解自增自减运算符,看懂表达式不糊涂 的相关文章

  • PHP 中的多个插入查询[重复]

    这个问题在这里已经有答案了 我正在尝试创建一个 php html 表单 它将结果插入到狗展数据库中 问题是 无论我做什么 我都会收到此错误 查询失败 您的 SQL 语法有错误 检查与您的 MySQL 服务器版本相对应的手册 了解在 INSE
  • Hibernate HQL:将对值作为 IN 子句中的参数传递

    我面临一个问题 如何使用 IN 子句将查询中的成对值的参数传递给 HQL 例如 select id name from ABC where id reg date in x y 并且参数是不同的数据类型string id 和reg date
  • 了解 Spark 中的 DAG

    问题是我有以下 DAG 我认为当需要洗牌时 火花将工作划分为不同的阶段 考虑阶段 0 和阶段 1 有些操作不需要洗牌 那么为什么 Spark 将它们分成不同的阶段呢 我认为跨分区的实际数据移动应该发生在第 2 阶段 因为这里我们需要cogr
  • 使用来自另一个数据库的选择查询更新 mysql 表

    我有两个数据库 我想用另一个数据库表中的值更新一个表 我正在使用以下查询 但它不起作用 UPDATE database1 table1 SET field2 database2 table1 field2 WHERE database1 t
  • 从路径中获取文件夹名称

    我有一些路c server folderName1 another name something another folder 我如何从那里提取最后一个文件夹名称 我尝试了几件事 但没有成功 我只是不想寻找最后的 然后就去休息了 Thank
  • 将自定义元数据添加到 jpeg 文件

    我正在开发一个图像处理项目 C 我需要在处理完成后将自定义元数据写入 jpeg 文件 我怎样才能做到这一点 有没有可用的图书馆可以做到这一点 如果您正在谈论 EXIF 元数据 您可能需要查看exiv2 http www exiv2 org
  • for循环中计数器变量的范围是多少?

    我在 Visual Studio 2008 中收到以下错误 Error 1 A local variable named i cannot be declared in this scope because it would give a
  • PDO语法错误

    我在一个项目中使用 PDO 但提交时出现语法错误 这是我的代码
  • clang 实例化后静态成员初始化

    这样的代码可以用 GCC 编译 但 clang 3 5 失败 include
  • 如何解决 PDFBox 没有 unicode 映射错误?

    我有一个现有的 PDF 文件 我想使用 python 脚本将其转换为 Excel 文件 目前正在使用PDFBox 但是存在多个类似以下错误 org apache pdfbox pdmodel font PDType0Font toUnico
  • 防止Java实例化的正确方法[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在 Carbon Laravel 中添加日期和另一个日期?

    在我的 laravel 项目中 我想将日期时间增加到前一个日期时间 这是我的代码 expire order 0 gt expire date new Carbon now gt addMonths 6 这两行的结果是 2018 01 28
  • 需要哪个版本的 Visual C++ 运行时库?

    microsoft 的最新 vcredist 2010 版 是否包含以前的版本 2008 SP1 和 2005 SP1 还是我需要安装全部 3 个版本 谢谢 你需要所有这些
  • C - 直接从键盘缓冲区读取

    这是C语言中的一个问题 如何直接读取键盘缓冲区中的数据 我想直接访问数据并将其存储在变量中 变量应该是什么数据类型 我需要它用于我们研究所目前正在开发的操作系统 它被称为 ICS OS 我不太清楚具体细节 它在 x86 32 位机器上运行
  • 为什么 C# Math.Ceiling 向下舍入?

    我今天过得很艰难 但有些事情不太对劲 在我的 C 代码中 我有这样的内容 Math Ceiling decimal this TotalRecordCount this PageSize Where int TotalRecordCount
  • const、span 和迭代器的问题

    我尝试编写一个按索引迭代容器的迭代器 AIt and a const It两者都允许更改容器的内容 AConst it and a const Const it两者都禁止更改容器的内容 之后 我尝试写一个span
  • Validation.ErrorTemplate 的 Wpf 动态资源查找

    在我的 App xaml 中 我定义了一个资源Validation ErrorTemplate 这取决于动态BorderBrush资源 我打算定义独特的BorderBrush在我拥有的每个窗口以及窗口内的不同块内
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • 如何使用 std::string 将所有出现的一个字符替换为两个字符?

    有没有一种简单的方法来替换所有出现的 in a std string with 转义 a 中的所有斜杠std string 完成此操作的最简单方法可能是boost字符串算法库 http www boost org doc libs 1 46
  • 如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

    有谁知道如何使用配置文件 ebextensions 在 AWS Elastic Beanstalk 上安装和启用 PHP IMAP 扩展 我使用的是 64 位 Amazon Linux 2017 03 v2 4 0 运行 PHP 7 0 1

随机推荐

  • Ansys workbench分析应用基础(6)

    圣维南原理和模型简化 如上图所示 我们对长度分别为100mm 150mm和200mm的板子添加完全均布载荷 二分之一均布载荷和线载荷 载荷的值相同 统计出不同模型不同情况所对应的应力最大值 如下图所示 从图中 我们可以看出对于板长为200m
  • 2023年5月份中国电子学会青少年软件编程(C语言)等级考试一级真题讲解

    1 输出第二个整数 题目描述 输入三个整数 把第二个输入的整数输出 输入 只有一行 共三个整数 整数之间由一个空格分隔 整数是32位有符号整数 输出 只有一行 一个整数 即输入的第二个整数 样例输入 123 456 789 样例输出 456
  • jsonp原理详解

    JSONP 全称 JSON with padding 是一种跨域请求的方法 它允许在不受限制地从一个域名获取数据并在另一个域名下使用该数据 JSONP 的原理是通过动态创建 script 标签来实现 在客户端向服务器发送请求时 服务器返回
  • 面试宝典----数据库(总结来自知乎路人甲)

    一 什么是存储过程 有哪些优缺点 存储过程是一些预编译的SQL语句 更加直白的理解 存储过程可以说是一个记录集 它是由一些T SQL语句组成的代码块 这些T SQL语句代码像一个方法一样实现一些功能 对单表或多表的增删改查 然后再给这个代码
  • svn 打patch

    patch patch 即 补丁 的意思 当代码有改动的时候 svn会产生diff 可以查看diff和打patch 使用Mac终端来打patch也是非常方便的 首先查看本地的修改 确认无误后 使用 svn diff gt PATCH 命令可
  • C++ main函数中参数argc和argv含义及用法

    argc 是 argument count的缩写 表示传入main函数的参数个数 argv 是 argument vector的缩写 表示传入main函数的参数序列或指针 并且第一个参数argv 0 一定是程序的名称 并且包含了程序所在的完
  • 2022美赛C题思路分享

    美赛c题 比特币和金子投资分析 问题翻译 下附思路 1 问题分析 本题题目理解较为简单 就是利用历史数据对于投资策略的分析 每一天的决策只能使用之前的历史数据 求解最佳的投资回报 并分析模型的可行性 2模型准备 时间序列分析模型选择 以及模
  • 学习实践-Whisper语音识别模型实战(部署+运行)

    1 Whisper内容简单介绍 OpenAI的语音识别模型Whisper Whisper 是一个自动语音识别 ASR Automatic Speech Recognition 系统 OpenAI 通过从网络上收集了 68 万小时的多语言 9
  • 【matplotlib】饼图+legend()、loc、color位置颜色图例中文显示(一个饼图的例子)

    博客已经搬家到 捕获完成 https www v2python com 1 原来自己做的饼图 http mp blog csdn net postedit 79222127 见文章 matplotlib 中文显示 负号显示 统计微信好友性别
  • 《再也不怕elasticsearch》Spring Boot集成Elasticsearch

    大家好我是迷途 一个在互联网行业 摸爬滚打的学子 热爱学习 热爱代码 热爱技术 热爱互联网的一切 再也不怕elasticsearch系列 帅途会慢慢由浅入深 为大家剖析一遍 各位大佬请放心 虽然这个系列帅途有时候更新的有点慢 但是绝对不会烂
  • django获取某一个字段的列表,values/values_list/flat

    django获取某一个字段的列表 values values list flat 2017年11月01日 11 43 28 阅读数 2241 python view plain copy class Building models Mode
  • C语言实现邻接矩阵(无向图的顺序表示)

    文章目录 有向 无向不带权图 带权图 定义图的结构体 初始化 分析 分配堆空间 对矩阵的行开辟空间 对矩阵 即二维数组 进行初始化 edge 0 0 edge 0 9 edge 1 0 edge 1 9 edge 2 0 edge 2 9
  • 全国物流快递查询网址大全

    http www kiees cn default htm
  • VMware&Linux详细安装步骤

    VMware Linux详细安装步骤 一 VmWare虚拟机的安装 1 安装虚拟机 注意 虚拟机安装完成后会在网络连接中多出两个虚拟网卡 二 在虚拟机上安装CentOS 1 创建新虚拟机 文件 新建虚拟机 或 直接点击 创建新的虚拟机 图标
  • python1_2列表(2)

    列表增删改查 1 增 all in list 0 3 hello True all in list append hello world 新增元素 print all in list 运行结果 2 插入 all in list 0 3 he
  • 机器学习-基础

    欢迎来到机器学习的世界 博客主页 卿云阁 欢迎关注 点赞 收藏 留言 本文由卿云阁原创 本阶段属于练气阶段 希望各位仙友顺利完成突破 首发时间 2021年5月5日 希望可以和大家一起完成进阶之路 作者水平很有限 如果发现错误 请留言轰炸哦
  • Java学习心得4——Java中的包是什么

    Java中的包完全可以理解成一个文件夹 如果你不信 我们可以做一些测试 1 我们先在eclipse中创建一个项目 java Project 命名为test 2 我们可以在文件资源管理器的中找到这个项目 3 我们双击进入test文件夹 再进入
  • 系统架构设计专业技能 · 信息安全技术

    点击进入系列文章目录 现在的一切都是为将来的梦想编织翅膀 让梦想在现实中展翅高飞 Now everything is for the future of dream weaving wings let the dream fly in re
  • 聊聊 cookie 管理那些事

    1 前言 在浏览内核加载网络资源的过程中我们离不开 HTTP 协议 它是在 Web 上进行数据交换的基础 同时也是一种无状态的 client server 协议 这种无状态的属性促使许多端存储技术产生 其中最重要的技术之一就是 cookie
  • 深入理解自增自减运算符,看懂表达式不糊涂

    自增运算符 和自减运算符 在算术表达式中容易造成使用上的错误 主要原因有两点 一是自增运算符和自减运算符在变量前后的位置不一样 其内部逻辑不一样 二是自增运算符和自减运算符只能用于变量 不能用于常量 首先讲解一下自增自减运算符的概念 自增自