JAVA面试题解惑系列(十一)——这些运算符你是否还记得?

上传人:碎****木 文档编号:220862106 上传时间:2021-12-09 格式:DOCX 页数:8 大小:22.63KB
返回 下载 相关 举报
JAVA面试题解惑系列(十一)——这些运算符你是否还记得?_第1页
第1页 / 共8页
JAVA面试题解惑系列(十一)——这些运算符你是否还记得?_第2页
第2页 / 共8页
JAVA面试题解惑系列(十一)——这些运算符你是否还记得?_第3页
第3页 / 共8页
亲,该文档总共8页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述

《JAVA面试题解惑系列(十一)——这些运算符你是否还记得?》由会员分享,可在线阅读,更多相关《JAVA面试题解惑系列(十一)——这些运算符你是否还记得?(8页珍藏版)》请在金锄头文库上搜索。

1、JAVA 面试题解惑系列十一这些运算符你是否还记得?有些运算符在 JAVA 语言中存在着,但是在实际开发中我们或许很少用到它们, 在面试题中却时常消灭它们的身影,对于这些运算符的含义和用法,你是否还记得呢?自增+和自减-运算符我们先来答复几个问题吧:Java 代码 1. inti=0;2. intj=i+;3. intk=-i;这段代码运行后,i 等于多少?j 等于多少?k 等于多少?太简洁了?好,连续:Java 代码 1. inti=0;2. intj=i+ + +i;3. intk=-i + i-;代码执行后 i、j、k 分别等于多少呢?还是很简洁?好,再连续: Java 代码 1. in

2、t i=0;2. System.out.println(i+);这段代码运行后输出结果是什么?0?1?Java 代码 1. float f=0.1F; 2. f+;3. double d=0.1D; 4. d+;5. char c=”a”;6. c+;上面这段代码可以编译通过吗?为什么?假设你能顺当答复到这里,说明你对自增和自减运算符的把握已经很好了。为了分析出上面提出的几个问题,我们首先来回忆一下相关学问: 自增+:将变量的值加 1,分前缀式如+i和后缀式如 i+。前缀式是先加 1 再使用;后缀式是先使用再加 1。 自减-:将变量的值减 1,分前缀式如-i和后缀式如 i-。前缀式是先减 1

3、再使用;后缀式是先使用再减 1。在第一个例子中,int j=i+;是后缀式,因此i 的值先被赐予 j,然后再自增 1, 所以这行代码运行后,i=1、j=0;而int k=-i;是前缀式,因此i 先自减 1,然后再将它的值赐予 k,因此这行代码运行后,i=0、k=0。在其次个例子中,对于 int j=i+ + +i;,首先运行 i+,i 的值 0 被用于加运算+,之后 i 自增值变为 1,然后运行+i,i 先自增变为 2,之后被用于加运算,最终将 i 两次的值相加的结果 0+2=2 赋给j,因此这行代码运行完毕后 i=2、 j=2;对于 int k=-i + i-;用一样的思路分析,具体过程在此

4、不再赘述,结果应当是 i=0、k=2。自增与自减运算符还遵循以下规律:1. 可以用于整数类型 byte、short、int、long,浮点类型 float、double, 以及字符串类型 char。2. 在 Java5.0 及以上版本中,它们可以用于根本类型对应的包装器类 Byte、Short、Integer、Long、Float、Double、Character。3. 它们的运算结果的类型与被运算的变量的类型一样。下面的这个例子验证以上列出的规律,它可以编译通过并执行。Java 代码 1. public class Test 2. public static void main(String

5、 args) 3. / 整型4. byte b = 0;5.b+;6. / 整型7. long l = 0;8.l+;9. / 浮点型10. double d = 0.0;11.d+;12. / 字符串13. char c = ”a”;14.c+;15./ 根本类型包装器类16.Integer i = new Integer(0);17.i+;18.19.按位运算符你还能说出来按位运算符一共有哪几种吗?比照下面的列表看看,有没有从你的记忆中消逝了的:1. 按位与运算&:二元运算符。当被运算的两个值都为 1 时,运算结果为 1;否那么为 0。2. 按位或运算|:二元运算符。当被运算的两个值都为

6、0 时,运算结果为 0;否那么为 1。3. 按位异或运算:二元运算符。当被运算的两个值中任意一个为 1, 另一个为 0 时,运算结果为 1;否那么为 0。4. 按位非运算:一元运算符。当被运算的值为 1 时,运算结果为 0; 当被运算的值为 0 时,运算结果为 1。这里不像我们看到的规律运算符与运算&、或运算|、非运算!操作的是布尔值 true 或 false,或者是一个能产生布尔值的表达式;“按位运算符”所指的“位”就是二进制位,因此它操作的是二进制的 0 和 1。在解释按位运算符的执行原理时,我们顺便说说它们和规律运算符的区分。1. 规律运算符只能操作布尔值或者一个能产生布尔值的表达式;按

7、位运算符能操作整型值,包括 byte、short、int、long,但是不能操作浮点型值即 float 和 double,它还可以操作字符型char值。按位运算符不能够操作对象,但是在 Java5.0 及以上版本中,byte、short、int、long、char 所对应的包装器类是个例外,由于 JAVA 虚拟时机自动将它们转换为对应的根本类型的数据。下面的例子验证了这条规律:Java 代码 1. public class BitOperatorTest 2. public static void main(String args) 3. / 整型4.byte b1 = 10, b2 = 20

8、;5. System.out.println(“(byte)10 & (byte)20 = “ + (b1 & b2);6. / 字符串型7.char c1 = ”a”, c2 = ”A”;8. System.out.println(“(char)a | (char)A = “ + (c1 | c2);9. / 根本类型的包装器类10. Long l1 = new Long(555), l2 = new Long(666);11. System.out.println(“(Long)555 (Long)666 = “ + ( l1 l2);12. / 浮点型13.float f1 = 0.8F

9、, f2 = 0.5F;14. / 编译报错,按位运算符不能用于浮点数类型15. / System.out.println(“(float)0.8 & (float)0.5 = “ + (f1 & f2);16. 17.运行结果:o (byte)10 & (byte)20 = 0o (char)a | (char)A = 97o (Long)555 (Long)666 = 1772. 规律运算符的运算遵循短路形式,而按位运算符那么不是。所谓短路就是一旦能够确定运算的结果,就不再进展余下的运算。下面的例子更加直观地呈现了短路与非短路的区分:Java 代码 0. public class Oper

10、atorTest 1. public boolean leftCondition() 2. System.out.println(“执行-返回值:false;方法:leftCondition()“);3. return false; 4.5.6. public boolean rightCondition() 7. System.out.println(“执行-返回值:true;方法:rightCondition()“);8. return true; 9.10.11. public int leftNumber() 12. System.out.println(“执行-返回值:0;方法:le

11、ftNumber()“);13. return 0;14. 15.16. public int rightNumber() 17. System.out.println(“执行-返回值:1;方法:rightNumber()“);18. return 1;19. 20.21. public static void main(String args) 22. OperatorTest ot = new OperatorTest(); 23.24. if (ot.leftCondition() & ot.rightCondition() 25. / do something26.27.System.

12、out.println(); 28.29.int i = ot.leftNumber() & ot.rightNumber();30. 31.运行结果:o 执行-返回值:false;方法:leftCondition()oo 执行-返回值:0;方法:leftNumber()o 执行-返回值:1;方法:rightNumber()运行结果已经很明显地显示了短路和非短路的区分,我们一起来分析一下产生这个运行结果的缘由。当运行“ot.leftCondition() & ot.rightCondition()”时,由于方法 leftCondition()返回了 false,而对于“&”运算来说,必需要运算

13、符两边的值都为 true 时,运算结果才为 true,因此这时候就可以确定,不管 rightCondition()的返回值是什么,“ot.leftCondition() & ot.rightCondition()”的运算值已经可以确定是 false,由于规律运算符是短路的形式,因此在这种状况下, rightCondition()方法就不再被运行了。而对于“ot.leftNumber() & ot.rightNumber()”,由于“leftNumber()”的返回值是 0,对于按位运算符“&”来说,必需要运算符两边的值都是 1 时,运算结果才是 1,因此这时不管“rightNumber()”方

14、法的返回值是多少,“ot.leftNumber() & ot.rightNumber()”的运算结果已经可以确定是 0,但是由于按位运算符是非短路的,所以rightNumber()方法还是被执行了。这就是短路与非短路的区分。移位运算符移位运算符和按位运算符一样,同属于位运算符,因此移位运算符的位指的也是二进制位。它包括以下几种:1. 左移位:将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规章是,假设被操作数的符号为正,那么在二进制的高位补 0; 假设被操作数的符号为负,那么在二进制的高位补 1。3. 无符号右移位:将操作符左侧的操作数向右移动操作符右侧指定的位数。移动的规章是,无论被操作数的符号是正是负,都在二进制位的高位补 0。留意,移位运算符不存在“无符号左移位”一说。与按位运算符一样, 移位运算符可以用于 byte、short、int、long 等整数类型,和字符串类型 char, 但是不能用于浮点数类型 float、double;固然,在Java5.0 及以上版本中,移

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 教育/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号