前言:这些文章是我个人的总结和所理解的内容,如果你觉得有哪些地方理解的还不够好,或者理解错误的,可以评论区告诉我,我会进行改正,谢谢!!!
一,什么是运算符?
相信小伙伴们在学习c语言程序设计的时候已经了解了,其实Java运算符和c语言的运算符是差不多的。要是没学过,也没关系,我也会在这里总结。
上面代码中的+或者<等符号就是运算符,即:对操作数进行操作时的符号,不同运算符操作的含义不同。
Java作为一门计算机语言,也提供了一套丰富的运算符来操纵变量。Java中运算符可以分为以下几种:算术运算符(+-*/%)、关系运算符(<>==)、逻辑运算符、位运算符以及条件运算符等等。
二,那我们就一一分析以下上面的运算符。
(1)基本四则运算符:加减乘除模(+-*/%)(我们就直接来看代码吧)
这上面的运算符运用和我们c语言的是一样的,和数学中的也是一样的,只是用代码的形式表达出来让计算机明白。但还是有一些细节我们需要注意的,我们很多时候都会遗忘这些细节。(看下面的代码)
需要注意的是:1,这些都是二元运算符,使用时必须要有左右两个操作数。
2,int/int结果还是int类型,而且会向下取整
这个代码可以看出,当用/或者%时,右操作数为零,编译器并不会给你报错,但是编译不通过,所以我们在写代码的时候一定要注意!!
我们再来看上面这个代码,+的左侧是int类型,右侧是double类型,在加上之前int被提升为double类型,所以输出的是1.2。所以,在两侧操作数类型不一致的时候,编译器会自动将类型小的向类型大的提升。
上面的代码可以知道,%不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的。
(2)增量运算符(+=、-=、*=、%=)
该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。
其余的增量运算符也一样这样子运用。需要注意的是,在上一篇中,“a=a+2 ”这样的代码编译器会报错,而a+=2却不会。还有一点就是,只有变量才能使用该运算符,常量不能用!!
(3)自增/自减运算符(++、--)
++就是给变量的值+1;--就是给变量的值-1。
那前置++(--)和后置++(--)有什么区别呢?学过c语言程序设计的应该都知道,我在这里就简单介绍了,以++为例(--也和++的用法一样)
我们可以直接从代码的对比看出,后置++(--)是先使用,再++(--);前置++(--)是先++(--),后使用。
我们需要注意的几点是:1,如果是单独使用,【前置++】和【后置++】没有任何区别。
2,只有变量才能使用自增/自减运算符,常量不能使用,因为常量不允许被修改。
(4)关系运算符
关系运算符主要有六个:==、!=、>=、<=、>、<,其计算结果是true和false(如下)
上面有一点需要提醒的是:在Java中= 表示赋值,与数学中的不同,==才表示相等(与c语言程序设计中的一样)。还有就是当需要多次判断的时候,不能连着写,如2<a<5,编译器会报错。
(5)逻辑运算符
逻辑运算符主要有三个:&&、||、!,运算结果都是boolean类型。
1,逻辑与(&&)
语法规则:表达式1&&表达式2,左右表达式必须是boolean类型的结果。
&&:两个表达式都为真的时候,整个表达式才是真,只要有一个是假,那么都是假!(如下图)
用代码表示就是
在这里需要注意一个点就是, 逻辑与也叫做“短路与”,意思是再“布尔表达式1&&布尔表达式2”中,当程序执行到布尔表达式1时,如果它为真,就继续执行布尔表达式2;如果布尔表达式1为假,就不会执行布尔表达式2。(如下)
表达式“10>20”为false,所以,不会再执行表达式2“10/0==0”。
2,逻辑或(||)
语法规则:布尔表达式1||布尔表达式2;(如下图)
用代码表示就是:
注意:左右表达式至少有一个是真,则结果为真。还有一个“短路或”,在“布尔表达式1||布尔表达式2”中,如果布尔表达式1为真,则为真,不会执行布尔表达式2;如果布尔表达式1为假,会继续执行布尔表达式2。总的来说,就是判断是否有“真”的表达式。(代码如下)
表达式“10>20”为false,就会执行“10/0==0”。我们都知道,计算10/0会导致程序异常,但是上面的代码却能正常运行,说明10/0并没有被真正求值。
3,逻辑非( !)
语法规则:!布尔表达式;
!:表示,假为真,真为假。
4,一些注意点(看以下代码)
如果我只写一个|或&,在Java里面,如果表达式结果为boolean类型时,也表示逻辑运算,但是与||和&&相比,他们不支持短路求值,也就是左右两个表达式都会执行。(如果表达式不是boolean类型,就是位运算)上面的程序不通过,会异常。
(6)位运算符
数据存储的最小单位是字节而数据操作的最小单位是比特位。字节是最小的存储单位,每个字节由8个二进制比特位组成,多个字节组合在一起可以表示各种不同的数据。
位运算符主要由四个:&、|、~、^,除了~是一元运算符外,其余的都是二元运算符。位操作表示按二进制位运算,计算机中都是使用二进制来表示数据的(01构成的序列),按位运算就是在按照二进制位的每一位依次进行计算。
1,按位与(&):如果两个二进制位都是1,则结果为1,否则为0.(也可以理解为:只要有一个是0,则为0)
上面代码是怎么实现的呢?(看下图)
2,按位或(|):如果两个二进制位都是0,则结果位0,否则结果位1(也可以理解为:只要有一个是1,则为1)
实现的方法与按位与的类似,在这里我就不写出来了。
3,按位异或(^):如果两个数字的二进制位相同,则结果为0,相异则结果为1。
注意:0x前缀的数字为十六进制数字,十六进制可以看成是二进制的简化表示方式 。一个十六进制数字对应4个二进制位。
4,按位取反(~):如果该位为0,则转为1;如果该位为1,则转为0。(如下例子)
注意:1,0xf表示十进制的15,也就是二进制的1111。
2,printf能够格式化输出内容,%x表示按照十六进制输出。
3,\n表示换行符。
(7)移位运算
移位运算符有三个:<< >> >>>,都是二元运算符,且都是按照二进制比特位来运算的。
1,左移(<<):最左侧位不要了,最右侧补0.(如下)
那这个代码是怎么实现的呢?
其实就是“0x10”转化为二进制就是“00010000”,“a<<1”表示左移一位,变成了“00100000”,也就是十六进制数的20。(我们可以看到10——》20,相当于乘2,可以这么认为,左移相当于乘法)
还有一个点需要注意的是:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数。
2,右移(>>):最右侧位不要了,最左侧补符号位(正数补0,负数补1)
这个代码实现和上面左移的操作差不多,可以自己尝试一下。(也可以认为右移相当于除法)
需要提醒的是:右移补的是符号位。
我们 需要注意的一点是,负数的右移,会向小取整,就好像上面的代码,右移相当于除法,那么-3/2的值为-1.5,取整就舍去小数位,但是右移则是向小取整,也就是加上-0.5,所以得出的是-2。
3,还有一个与c语言有所不同的移位运算符是无符号右移(>>>):也就是最右侧位不要了,最左侧补0(不管是正数还是负数都统统补0)(如下代码)
注意:
1,由于计算机计算移位效率高于计算乘除,当某个代码正好乘除2的n次方的时候可以用移位运算代替。
2,移动负数位或者移位位数过大都没有意义。
3,左移1位,相当于原数字2。那左移n位,就相当于原数字2的n次方。
4,同样,右移1位,相当于原数字/2.那右移n位就相当于原数字/2的n次方。
5,右移有无符号右移,但左移没有无符号左移。
(8)条件运算符
条件运算符只有一个:布尔表达式1?表达式2:表达式3(这个运算符也是Java中唯一一个三目运算符,时条件判断语句的简化写法)
解析:当表达式1的值为true时,整个表达式的值为表达式2的值;当表达式1的值为false时,整个表达式的值为表达式3的值。(我们写几个简单的代码来理解一下,如下)
这个运算符还有几点需要注意的:
1,表达式2和表达式3的结果是要同类型的,不同类型的会报错,除非能发生类型隐式类型转换。(如下)
2,表达式不能单独存在,其产生的结果必须要被使用。(如下)
三,运算符的优先级
在一条表达式中,各个运算符可以混合起来运算,但是运算符的优先级不同 ,比如:*和/的优先级要高于+和-,有些情况不注意,可能就会造成很大的麻烦。(如下面的一个代码)
由于+的优先级高于>>,所以a先和(b-a)相加,此时整体为20,最后在进行右移 ,所以结果为10。
其实我们不必记各种运算符之间的优先级,再可能存在歧义的代码中加上括号即可(像下面代码)
后记:这一章运算符的知识比较简单,就总结到这里,希望对你们有用。
各位大佬和正在成为大佬的路上的小朋友们,如果你们觉得我总结的可以,对你有用的,可以给我来一个一键三连,谢谢啦!!关注我,我们一起学习!!加油哦!!
版权归原作者 肖肖的猪会飞 所有, 如有侵权,请联系我们删除。