运算
关系运算
布尔类型
接着上一篇继续讲布尔类型,下面创建两个布尔类型的变量并输出看下结果:
public static void main(String[] args) {boolean bool1 = true;boolean bool2 = false;System.out.println(bool1);//trueSystem.out.println(bool2);//false}
代码中的boolean表示变量bool1和bool2是布尔类型,而且分别初始化值为true和false,从输出结果看,程序没有对boolean类型的值做特殊处理,像int类型一样,直接输出了值本身。
这里先姑且这样理解,待后续讲到字符串类String后,再来从内部分析。
关系运算
关系运算是使用关系运算符把两个变量关联起来,作为表达式,输出一个布尔类型的结果。比如比较变量x是否大于变量y,看下面代码:
public static void main(String[] args) {int x = 5;int y = 6;System.out.println(x > y);//false}
代码中使用关系运算符>,把x和y两个变量关联起来,输出了一个布尔类型的结果false。含义就是x变量大于y变量是个假命题。这样的关系运算符还有<、>=、<=、==、!=,分别表示小于、大于等于、小于等于、等于、不等于,看下面代码:
public static void main(String[] args) {int x = 5;int y = 6;System.out.println(x < y);//trueint z = 5;System.out.println(x >= z);//trueSystem.out.println(x <= z);//trueSystem.out.println(x == z);//trueSystem.out.println(x != z);//false}
输出结果就是x、y、z三个变量各种比较的布尔结果。
逻辑运算
逻辑运算是使用逻辑运算符把布尔类型的变量关联起来作为表达式,输出一个布尔类型的结果。注意下和关系运算的区别,关系运算并没有规定表达式中变量的类型。
逻辑运算符这里介绍三个:&&、||、!,分别表示与、或、非。
在与的关系中,&&两边都是true,结果才是true,否则结果都是false。
在或的关系中,||两边只要有一个true,结果就是true,否则才是false。
非比较好理解,非true就是false,非false就是true。
下面来看代码:
public static void main(String[] args) {boolean b1 = false;boolean b2 = true;//与System.out.println(b1 && b1);//falserSystem.out.println(b1 && b2);//falserSystem.out.println(b2 && b1);//falserSystem.out.println(b2 && b2);//true//或System.out.println(b1 || b1);//falserSystem.out.println(b1 || b2);//trueSystem.out.println(b2 || b1);//trueSystem.out.println(b2 || b2);//true//非System.out.println(!b1);//trueSystem.out.println(!b2);//falser}
通过结果再回头看上面讲的三句话,是否更容易理解一些。
在编辑器中会有4行代码出现黄色的警告信息,不用担心,它暂时不会影响到结果输出,到后续讲到流程控制时会解释为什么会出现警告。
另外,注意如果参与逻辑运算的是表达式,需要先确定表达式的值,再进行逻辑运算,如下面这个例子:
public static void main(String[] args) {int x = 5;int y = 6;System.out.println(x > y || y > x);//true}
代码中先需要确认x>y是false,然后确认y>x是true,最后进行||运算,false||true结果是true。
三元运算
三元运算有的也叫三目运算,在三元运算的表达式中会有两个结果的备选值,具体输出哪个,由一个布尔表达式来确定。运算符由?和:两部分组成,看下面代码:
public static void main(String[] args) {//三元运算boolean b1 = false;boolean b2 = true;System.out.println(b1 ? 0 : 1);//1System.out.println(b2 ? 0 : 1);//0}
分析下结果,布尔类型的变量b1是false,输出了:后面的值1;布尔类型的变量b2是true,输出了:前面的值0。可以简单得出结论:?前的布尔表达式等于true则返回:前的值,等于false则返回:后的值。当然,这样通过结论倒推运算原理的做法不科学,但在入门阶段,可以作为一种理解陌生代码的途径。
之前讲的内容都比较简单,容易理解,下面我设计了一个稍微复杂一点儿的代码逻辑,来验证下学习成果,看下面代码:
public static void main(String[] args) {int x = 100;int y = 25;int z = 6;x += y;x /= 20;boolean b1 = x > z ? true : false;System.out.println(b1);int k = 5;int m = 4;int n = 4;boolean b2 = m < -- k || n > k -- ? true : false;System.out.println(b2);}
根据学习到的知识点,手动运算下,然后对比下程序和手动运算的结果是否一致。
下面我来一步步分析一下上面这个代码的计算流程。
先看比较简单的第一部分:
1.定义了三个int类型的变量x、y、z分别是100、25、6
2.运算x加y,并把结果值赋给x,此时x是125
3.运算x除20,并把结果值赋给x,java中int类型的除,没有余数和小数,所以此时x是6
4.三元运算,判断x是否大于z,因为6大于6是假命题,所以返回:后面的部分false,并复制给b1
所以第一个输出是false。
继续看第二部分,这里涉及到一个运算符优先级的问题,一般规律:
算术运算符>关系运算符>逻辑运算符>赋值运算符
所以:
1.定义了三个int类型的变量k、m、n,分别是5、4、4
2.先执行前减减k,再比较m是否小于k,因为是前减减,所以先执行变量减1再使用,所以此时和m比较的值是4,所以||前半部分的值是false
3.先执行后减减k,再比较n是否大于k,因为是后减减,所以先使用再执行变量减1,所以此时和n比较的值是4,所以||后半部分的值是false
4.||两侧都是false,所以最后三元运算布尔表达式的结果是false,返回:后面的值false