Java Grammar(二):运算符

软件发布|下载排行|最新软件

当前位置:首页IT学院IT技术

Java Grammar(二):运算符

Vi的技术博客   2020-03-16 我要评论
### 运算符简介 计算机自打诞生以来,用作最多的就是进行**计算**,而计算离不开运算符,所以运算符在我们的Java语言中的地位举足轻重,我们现在就来了解一下Java给我们提供的运算符。 从运算的元素的个数来区分,可以分为一元运算符,二元运算符,三元运算符。 其中一元运算符包括: - +(正数) - -(负数) - ++(自增1) - —(自减1) - ~(按位取反) - !(逻辑取反) > 其实自增和自减也可以看成是特殊的二元运算符 二元运算符包括: - 算术运算符:`+ ,-,*,/,%` - 逻辑运算符:`&&,||` - 关系运算符:`==,!=,>,<,>=,<=` - 位运算符:`&,|,^,<<,>>,>>>` - 赋值运算符:`=,+=,-=,*=,/=,%=,<<=,>>=,&=,^=` - instanceof运算符:`instanceof` 三元运算符就只有一种:` ?:` ![7CF6586D-17A7-43B7-BC31-A29EBDD1B23A](http://ww2.sinaimg.cn/large/006tNc79gy1g5vscu7kf5j30tq0kcgnd.jpg) 这些运算相信绝大部分已经被在座的各位所熟知,只有极个别的不是很清楚的,下面我所了解的一些面试热点知识来进行讲解。 ### 一些运算符的小常识 #### 自增,自减的前后位置 老生常谈的一个问题,但是还是容易被搞混,自增和自减的顺序前后到底有何不同: - **单独使用**的时候,两种**没有**任何区别(温馨提示:**面试的时候切记不要忘记第一点哟**) - 在**表达式**中使用的时候,前缀会**先进行**+1(-1)的运算,而后缀会先运算**后进行**+1(-1); 在无视掉第一种情况的下,可以简单记为**前缀前,后缀后**。 #### 逻辑运算符的短路特性 我们在使用逻辑运算符`&&,||`的时候,可以利用逻辑运算符的短路特性减少运算次数,所谓短路特性就是**当第一个条件可以判断最终结果的时候,就不会去判断第二个条件** ```java A && B (当A为false,直接跳过第二个条件的判断,判定为false) A || B (当A为true,直接跳过第二个条件的判断,判定为true) ``` #### 三元运算符 该运算符的主要是决定哪个值应该赋值给变量。 ```java int a , b; a = 10; // 如果 a 等于 1 成立,则设置 b 为 20,否则为 30 b = (a == 1) ? 20 : 30; System.out.println( "Value of b is : " + b ); // 如果 a 等于 10 成立,则设置 b 为 20,否则为 30 b = (a == 10) ? 20 : 30; System.out.println( "Value of b is : " + b ); ``` #### instanceof 该运算符用于操作对象实例,检查该对象是否是一个特定类型(类类型或接口类型)。 ```java Vehicle a = new Car(); boolean result = a instanceof Car; System.out.println( result); ``` ### 位运算符 位运算符可能在我们日常中使用的并不是很多,算是一个小盲区。但是其实这个运算符还是非常的重要的,我们首先来了解一下运算的机制,与其他运算符不同的是,位运算符是要讲数值转换成二进制后,再进行运算。 `&` ![95D04C0D-1F8E-483D-9737-7FA44129BE31](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsebfv8uj30o00d8wht.jpg) `|` ![AD20CC8F-CAFD-4C48-94BD-ABED28D279AE](http://ww1.sinaimg.cn/large/006tNc79gy1g5vsej2kc3j30qi0cqdj9.jpg) `^`是按位异或运算符,只有两个对应的运算位不一致的时候,对应计算出的位置为1,否则为0。 `~`是按位取反运算符,将每一位取反(1 -> 0,0 ->1) ![57BB3EC6-07B2-4B57-B9CC-2A3FFA4DFD33](http://ww4.sinaimg.cn/large/006tNc79gy1g5vsf7vdshj310u0b0tbz.jpg) 这里需要注意`>>`和`>>>`存在一定的区别: `>>` :该数对应的二进制码整体右移,左边的用**原有标志位**补充,右边超出的部分舍弃。 `>>>` :不管正负标志位为0还是1,将该数的二进制码整体右移,左边部分总是以0填充,右边部分舍弃。 其余操作部分与`<<`类似,就不再画图演示 #### 位运算符的运用场景 - 计算 $m * 2^n$ 次方 ```java 2 << 3 = 16; 2 * (2 * 2 * 2) = 16; ``` - 判断一个数n的奇偶性 ```java a & 1 = 0; // 偶数 a & 1 = 1; // 奇数 ``` - 不用临时变量交换两个数 ```java a = a^b; b = b^a; a = a^b; ``` - x 的 相反数 表示为 (~x+1) ```java -x = (~x+1) ``` - 取绝对值 (a^(a>>31))-(a>>31) 其余的一些在算法中用到的场景,我这里就不再多少,有兴趣的同学可以去研究一下~ ### 运算符优先级 最高优先级的在该表上方,最低优先级的在该表底部 | 类别 | 操作符 | 关联性 | | :------- | :---------------- | :------- | | 后缀 | ()[].(点操作符) | 左到右 | | 一元 | ++ - !~ | 右到左 | | 乘性 | * / % | 左到右 | | 加性 | + - | 左到右 | | 移位 | \>\> \>\>\> << | 左到右 | | 关系 | \> \>= = < <= | 左到右 | | 相等 | == ~= | 左到右 | | 按位与 | & | 左到右 | | 按位异或 | ^ | 左到右 | | 按位或 | \| | 左到右 | | 逻辑与 | && | 左到右 | | 逻辑或 | \|\| | 左到右 | | 条件 | ?: | 从右到左 | | 赋值 | =,+=,-=,等等 | 从右到左 | | 逗号 | , | 左到右 | ### 公众号 动动小手点点关注,就是对创作者最大的支持和赞同 ![](http://viyoungblog.oss-cn-beijing.aliyuncs.com/viyoung/2020-03-15-qrcode_for_gh_a65beceb0947_258.jpg)

Copyright 2022 版权所有 软件发布 访问手机版

声明:所有软件和文章来自软件开发商或者作者 如有异议 请与本站联系 联系我们