自增自减运算符、初识Math类、逻辑运算符及位运算符
1、自增自减运算符(一元运算符)
-
-
++放置的位置不同,表达的含义不同,先看如下的案例
-
定义3个变量,a直接赋值为3,b赋值为a++,c赋值为++a
-
分别输出3个变量的值,a=5,b=3,c=5
-
a++和++a的含义,都是a = a + 1,区别在于计算的时机不同,也是导致b和c的值输出后相差2的原因
-
a++先让a先参与所在代码的运行,然后再自增,++a先自增1,再参与所在代码的运行
-
a的初始赋值为3,代码的运行结果是为b赋值,先参与运行后自增,即先为b赋值3,然后再自增1,所以最后b输出的值是3,但输出之后,a实际的值已经为4
-
++a则刚好相反,先自增1,然后再参与代码运行。程序是由上往下依次执行,在上一步为b赋值,之后自增1,a的值已经变成了4,++a先让a的值自增1,再运行代码赋值给c,即c的值已经是5,所以c输出的值为5
-
下图的验证方法,可以验证上述的理论
-
在b = a++代码下面插入一行代码,在为b赋值之后,立刻输出a的值
-
可以看到此时输出的值为4,由此印证了上述的理论,a++是先参与运行代码,将a初始定义的值3赋值给b,所以b的值输出为3,然后再执行a = a + 1,此时a的值变为4,相当于a++是在int b = a++代码下面,自动加了一行隐藏的a = a + 1
-
而++a则相反,先执行自增a = a + 1,因为上一行代码int b = a++已经让a的值自增为4,所以此时a的值已经是5了,然后再执行代码,将a的值赋值给c,所以c的值输出为5,相当于++a是在int c = ++a代码上面,自动加了一行隐藏代码a = a + 1
-
-
自减--的定义和理论和++一摸一样,只是功能从自增1,变成了自减1,其余的特性完全相同
2、Math类
-
Java中,class表示类,然而很多的操作都需要用工具类来实现
-
Math就是经常用于计算的一个工具类
-
如下图,当我们需要进行幂运算(即求某个数字的多少次方的运算)时,可以使用Math工具类很方便的实现
-
输入Math. ,可以看到很多用于计算的关键字,然后选择pow,并在括号里输出2,3,即求2的3次方是多少,然后创建对象pow,赋值为Math.pow(2,3); 之后输出pow的值,可以看到运算的结果为8
-
上述的步骤可以简化为,如下图
-
在Math.pow(2,3);这一行按住Alt + Enter,会出现一个选项,鼠标点击一下选项,就可以直接变为double pow = Math.pow(2, 3);
-
或者是在Math.pow(2,3);这一行按住Alt,然后连续敲两次回车键,也可以直接变为double pow = Math.pow(2, 3);
3、逻辑运算符
-
逻辑运算符有:与(&&)、或(||)、非(!)三种
-
与运算相当于and,每个部分的结果都为真,则最终结果为真,否则为假
-
或运算相当于or,只要有一个部分的结果为真,则最终结果为真,否则为假
-
非运算相当于取反,如果结果为真,则为假,如果结果为假,则为真
-
逻辑运算符的输出结果都是真或者假,所以定义逻辑运算符的变量,需要用到布尔值(boolean)数据类型
-
如下图,定义两个变量a、b,a变量赋值为true(真),b变量赋值为false(假),然后分别进行与运算,或运算,非运算
-
由上图可知,a为true,b为false,a && b,是真 与 假,并非所有的结果都为真,所以返回false;a || b,是真 或 假,有一个结果为真,所以返回true;!( a && b ),是a && b的结果取反,a && b的结果为false,所以取反的结果为true。
-
短路运算
-
定义2个变量c和d,为int类型的c赋值5,boolean类型的d等于(c<4)&&(c++<4),并且分别输出d和c的值
-
执行代码得到的结果如上图,d的值为false,因为c的值为5,&&是与运算,每个结果都为真,输出才为真,而第一个判断c<4是错误的,一个结果为假,与运算的结果就为假,则d的值就为false,而第二个判断是c++<4,如果执行了这一步,则c的值会在参与代码运行后+1,c的值本来为5,+1则为6,但实际上我们可以看到最终输出c的值仍然是5,说明c++<4这个部分的代码根本就没有执行,这就是所谓的短路运算
-
短路运算,当一行逻辑运算中某个判断已经可以决定这行代码的结果时,程序就不会继续运行这行代码之后剩余的部分了,而是直接中断运行,保留这行代码的判断结果,继续执行下一行代码
4、位运算
-
位运算符同样有与、或、非、取反:& 、| 、 ^ 、 ~
-
定义2个位变量A和B,A = 0011 1100;B = 0000 1101
-
与运算:A和B的值的每一位相比较,都为0则是0,都为1则是1,如果分别为0和1,则是0
-
或运算:A和B的值的每一位相比较,都为0则是0,其中一个为1,则是1,都为1,也是1
-
异或:A和B的值的每一位相比较,相同则为0,不同则为1
-
取反:B的每一位的值都取反,0则为1,1则为0
如下图
5、进阶(位运算实际应用)
-
2*8=16,如何运算最快
-
可以拆分为2 * 2 * 2 * 2,但这样不是最快
-
可以用到左移(<<)、右移(>>)
-
意思是将数字1,在2进制的位中向左或者向右移动,如下图,每向左移动一位,则表示的值越大
-
例如System.out.println(2<<3),是表示将2(也就是0000 0010)中的1,往左边移动3位,变成了0001 0000,也就是16
-
所以左移<<,就相当于* 2
-
右移>>,就相当于/2
-
-
注意:因为左移和右移是直接和系统底层的二进制打交道,所以效率极高
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 使用C#创建一个MCP客户端
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列1:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现