基本介绍

自增(++)和自减(--)运算符是对变量在原始值的基础上进行加1或减1的操作。

它们都有前缀和后缀两种形式。

前缀就是++在前面,后缀就是++在后面

前缀先自增(减),后缀后自增(减)

前缀形式的运算规则可以概括为:“先自增(减),后引用”,如 ++a

后缀形式的运算规则可以概括为:“先引用,后自增(减)”,如 a++。

这里所说的“引用”,指的是使用变量的值,将值放入操作栈的动作。

另外,我们还要强调一个细节:无论是前缀形式还是后缀形式,自增自减运算符的优先级要 > 赋值运算符。

一、仅有++或--

 1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 a++;
6 System.out.println(a);//输出3
7 int b=2;
8 ++b;
9 System.out.println(b);//输出3
10 }
11 }

可以看到,当仅做++或--时,不管是后缀式a++,还是前缀式++b,输出的结果都是一样的。因为仅自身++或--,并不会有“引用”,也就是不会有操作栈的动作。

二、++或--运算结果赋值给其他变量

 1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 int b=a++;
6 System.out.println(a);//输出3
7 System.out.println(b);//输出2
8 int c=2;
9 int d=++c;
10 System.out.println(c);//输出3
11 System.out.println(d);//输出3
12 }
13 }

当有赋值或加减等操作时,就会用到操作栈。

a=2  b=a++ 是后缀式,“先引用,后自增(减)”

第①步:先把a的值2,放入操作栈

第②步:a再自增变成3

第③步:将操作栈里的值2赋值给b

c=2  d=++c 是前缀式,“先自增(减),后引用”

第①步:c先自增变成3

第②步:再把c的值3,放入操作栈

第③步:将操作栈里的值3赋值给b

再来看下运算后再赋值的

1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 int b=++a + ++a;
6 System.out.println(a);//输出4
7 System.out.println(b);//输出7
8 }
9 }

++a 是前缀式,“先自增(减),后引用”

第①步:a先自增变成3

第②步:再把a的值3,放入操作栈1

第③步:a再自增变成4

第④步:再把a的值4,放入操作栈2

第⑤步:把操作栈1中的数据3和操作栈2中的数据4相加,赋值给b

1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 int b=++a + a++;
6 System.out.println(a);//输出4
7 System.out.println(b);//输出6
8 }
9 }

和上面相比,a++ 是后缀式,“先引用,后自增(减)”

就是上面第③步和第④步互换,先将a的值3放入操作栈2,所以输出的是3+3=6。

三、++或--运算结果赋值给自身

 1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 a=++a;
6 System.out.println(a);//输出3
7 int b=2;
8 b=b++;
9 System.out.println(b);//输出2
10 }
11 }

++a 是前缀式,“先自增(减),后引用”,所以是先自增为3,再把3放入操作栈,最后把操作栈中的3赋值给a。

b++ 是后缀式,“先引用,后自增(减)”,所以是先将b的值2放入操作栈,再自增为3,最后把操作栈中的2赋值给b。

再看个复合赋值运算+=

当语句中以复合赋值运算符给变量赋值的时候,计算机会先把复合赋值运算符左边变量的值存入操作数栈。

1 public class Test1 {
2
3 public static void main(String[] args) {
4 int a=2;
5 a+=++a + ++a;
6 System.out.println(a);//输出9
7 }
8 }

前面已经讲到,++a + ++a的值为7,计算机先把a的值2放入操作栈1,再把右边的计算结果存入操作数栈2,最后把操作数栈1和操作数栈2中的数值相加,赋值给a,所以是2+7=9。

学透java自增(++)自减(--)运算符的更多相关文章

  1. java自增(自减)运算符

    自增(自减)运算符: ++ --就是可以将当前变量自我增加(减少)1 的运算符. i++, 后++, 先将 i 的值作为整个表达的值, 然后将 i 增加 1. ++i, 先++, 先将 i 增加 ...

  2. Java自增自减运算符

    3.1自增自减运算符 注意事项: ++和--既可以放在变量的后边,也可以放在变量的前边 单独实用的时候,++和--无论是放在变量的前边还是后边,结果是一样的 参与操作的时候,如果放在变量的后边,先拿变 ...

  3. java入门---运算符&算术运算符&自增自减运算符&关系运算符&位运算符

        计算机的最基本用途之一就是执行数学运算,作为一门计算机语言,Java也提供了一套丰富的运算符来操纵变量.我们可以把运算符分成以下几组: 算术运算符 关系运算符 位运算符 逻辑运算符 赋值运算符 ...

  4. 023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之——自增自减运算符

    023 01 Android 零基础入门 01 Java基础语法 03 Java运算符 03 算术运算符之--自增自减运算符 本文知识点:Java算术运算符中的自增自减运算符 自增自减运算符 之前我们 ...

  5. 【java从入门到精通】day-06-基本运算符-自增自减运算符

    1.运算符 java语言支持如下运算符: 算术运算符:+,-,*,/,%,++,-- 赋值运算符:= 关系运算符:>,<,>=,<=,==,!=,instanceof 逻辑运算 ...

  6. 2-1赋值运算符 & 2-2自增自减运算符 &2-3

    2-1赋值运算符 先定义一个变量,把定义好的变量在赋值给另外一个变量.变向之间的互相赋值 2-2自增自减运算符 元素符,放在变量前和变量后的区别 先进行自增运算,再进行赋值运算.这里先进行num1的+ ...

  7. 【转】 C语言自增自减运算符深入剖析

    转自:http://bbs.csdn.net/topics/330189207 C语言的自增++,自减--运算符对于初学者来说一直都是个难题,甚至很多老手也会产生困惑,最近我在网上看到一个问题:#in ...

  8. C语言系列之自增自减运算符的用法(二)

    运算符中最难理解的有自增自减运算符的使用方法,下面我将简单总结一下他们的使用方法 我们知道,C语言运行是由右向左运行的 下面我们来看一个例子 当i等于3的时候 j=++i; 由上面可知,C语言是由右向 ...

  9. c语言:自增自减运算符的操作详解

    博主在回忆c语言的基本知识时,突然发现自增自减运算符(--.++)这个知识点有些模糊不清,故博主为了给同为小白的同学们提供一些经验,特写下这篇文章. 首先,自增自减运算符共有两种操作方式. 比如,我先 ...

  10. JAVA中自增自减运算符(i++与++i的区别)

    注意: 自增运算符和自减运算符只能用于变量,而不能用于常亮或表达式 运算符 运算 范例 结果 ++ 自增(前):先运算后取值 a=2;b=++a; a=3;b=3; ++ 自增(后):先取值后运算 a ...

随机推荐

  1. 五分钟 k8s入门到实战--跨服务调用

    背景 在做传统业务开发的时候,当我们的服务提供方有多个实例时,往往我们需要将对方的服务列表保存在本地,然后采用一定的算法进行调用:当服务提供方的列表变化时还得及时通知调用方. student: url ...

  2. KRPano插件解密大师更新支持最新版KRPano的XML/JS解密

    KRPano插件解密大师是一款专业的全景解密工具,它可以帮助你轻松解密KRPano的XML/JS插件,还能分析下载静态和动态网站的资源.你无需任何编程知识,只需一键点击,就能快速完成解密,学习全景开发 ...

  3. Modbus转Profinet网关改写变频器运行状态在1200PLC程序控制实例

    兴达易控Modbus转Profinet网关将丹佛斯变频器接入西门子 1200PLC 配置案例 案例简介: 本案例是兴达易控Modbus转Profinet网关连接丹佛斯变频器在西门子 1200PLC程序 ...

  4. 【c#版本Openfeign】Net8 自带OpenFeign实现远程接口调用

    引言 相信巨硬,我们便一直硬.Net版本到现在已经出了7了,8也已经在预览版了,相信在一个半月就会正式发布,其中也有很多拭目以待的新功能了,不仅仅有Apm和Tap的结合,TaskToAscynResu ...

  5. ReactPortals传送门

    ReactPortals传送门 React Portals提供了一种将子节点渲染到父组件以外的DOM节点的解决方案,即允许将JSX作为children渲染至DOM的不同部分,最常见用例是子组件需要从视 ...

  6. 如何用ppt打印9张一面,并且去除边距?

    如何用ppt打印9张一面,并且去除边距?      方法其实很简单,答主不要在ppt软件的打印选项里设置[每页打印9张幻灯片],而是使用默认的[每页打印1张幻灯片]. 然后去[打印机属性]里设置,我是 ...

  7. 从链接器的角度详细分析g++报错: (.text+0x24): undefined reference to `main'

    /usr/bin/ld: /usr/lib/gcc/x86_64-linux-gnu/9/../../../x86_64-linux-gnu/Scrt1.o: in function `_start' ...

  8. HDU 1312 Red and Black 题解

    //注意边界判断,调了好久#include <iostream> #include <queue> using namespace std; #define check(x,y ...

  9. Lucky Array 题解

    Lucky Array 题目大意 维护一个序列,支持以下操作: 区间加一个大于 \(0\) 的数. 区间查询有多少个数位上只包含 \(4\) 或 \(7\) 的数. 思路分析 看起来很不可做,但考虑到 ...

  10. 从零用VitePress搭建博客教程(1) – VitePress的安装和运行

    1.从零用VitePress搭建博客说明(1) – VitePress的安装和运行 一.写在前面 最近在想更新一把自己的前端吧小博客,但发现wordPress版本停留在了5年之前,发现变化挺大,不支持 ...