scjp考试准备 - 2 - 逻辑运算及类型转换
判断如下代码的执行结果:
public class Spock{ public static void main(String[] args){ Long tail = 2000L; Long distance = 1999L; Long story = 1000L; if( (tail>distance) ^ ((story*2)==tail ) ) System.out.print("1"); if((distance+1 !=tail) ^ ((story*2)==distance) ) System.out.print("2"); } }
这道题考察的是逻辑运算及条件判断,同时以基本类型的包装类和自动类型转换做烟幕。
Java中的逻辑运算符有6个,三个比较常见的与(&&)、或(||)、非(!);三个用的比较少的不短路与(&)、不短路或(|)、异或(^)。
着重理解下后三个:
不短路与(&):和短路与(&&)功能相同。不同处在于短路与(&&)在判断第一个表达式错误后就不会计算其余的表达式,不短路与(&)总是会计算所有的表达式;
不短路或(|):和短路或(||)功能相同。不同处在于短路或(||)在判断第一个表达式正确后就不会计算其余的表达式,不短路或(|)总是会计算所有的表达式;
异或(^):两个表达式相同返回false;表达式不同返回true(这家伙唯恐天下不乱)。
此外这三个还是位运算符(不详说)。
基本类型的包装类。这里使用了包装类的自动装箱和自动拆箱功能。自动装箱是指可以把一个基本类型的变量直接赋给对应包装类的变量,或者赋给Object变量;自动拆箱则与之相反,可以把包装类的变量赋给对应基本类型的变量。自动拆箱和自动装箱功能是在JDK1.5之后出现的。
基本类型的自动转换遵循如下规则:
在一个算术表达式中,如果有多个不同基本数据类型的值,那么表达式的值会自动提升到表达式中最高等级数值的类型。
自动装箱时类型不会自动转换;自动拆箱时会执行自动转换(实际上是先拆箱再自动转换)。
说了这许多,再看看这题——简单的加减乘除好吧。
第一个条件判断全为true,第二个条件判断全为false,最后什么也不会输出。
so,心思还是单纯点比较好
仅是学习笔记,难免出错,望不吝指点