三、运算符
3.1、运算符
-
可以分成四类:算术运算符、位运算符、关系运算符以及逻辑运算符
3.1.1、赋值运算符
-
”=“ 例如 int x ;
-
x=10;
3.1.2、 算术运算符
运算符 | 结 果 |
---|---|
+ | 加法(也是一元加号) |
- | 减法(也是一元负号) |
* | 乘法 |
/ | 除法 |
% | 求模/取余 |
+= | 加并赋值 |
-= | 减并赋值 |
*= | 乘并赋值 |
/= | 除并赋值 |
%= | 求模并赋值 |
++ | 自增 |
-- | 自减 |
3.1.2.1、 算术与赋值复合运算符
int a = 3 a += 4; //相当于a = a+4;
(1)对于所有的二元算术运算,都有相应的复合赋值运算符。
(2)复合赋值运算符的效率更高。所以在专业的Java程序中,会经常看到复合赋值运算符。
3.1.2.2、自增与自减
(1)自增运算符将其操作数加1。自减运算符将其操作数减1。
(2)自增与自减分前缀形式与后缀形式。++、--
//前缀形式: int i = 10; int a = ++ i; //等同于 i++; int a = i; 所以a=11, i= 11 //后缀形式: int j = 10; int b = j++; //等同于 int b = j; j++; 所以b=10,j = 11
3.1.2.3 表达式
(1)表达式的概念:由操作数与运算符组成 j++; a+b;
(2)表达式的求值:表达式是有值的,需要注意表达式值的类型
(3)表达式中的类型提升规则:
表达式的类型会自动提升为所有操作数的最大类型。
对于操作数全为非long类型整数的表达式,其类型会自动提升为int。
public class ExpressionDemo { public static void main(String[] args) { byte b=127; short s =10; b = (byte) (b+s); System.out.println(s); } } //输出结果 //10
3.1.3、关系运算符
关系运算符也称为比较运算符
运算符 | 结 果 |
---|---|
== | 等于 |
!= | 不等于 |
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
(1)关系运算的结果为boolean型数值。
(2)关系运算符最常用于if语句和各种循环语句中的控制表达式。
int n =581; short s =100; System.out.println(n>=s); System.out.println(n==s); System.out.println(n!=s); // true //false //true
3.1.4 逻辑运算符
布尔逻辑运算符,只能操作boolean型操作数。
运算符 | 结 果 |
---|---|
&& | 逻辑与(短路形式) |
|| | 逻辑或(短路形式) |
^ | 逻辑异或 |
! | 逻辑一元非 |
& | 逻辑与 |
| | 逻辑或 |
布尔逻辑运算规则:
操作数 | 逻辑运算及结果 | ||||
---|---|---|---|---|---|
A | B | A || B | A && B | !A | A ^ B |
false | false | false | false | true | false |
true | false | true | false | false | true |
false | true | true | false | true | true |
true | true | true | true | false | false |
运算规则说明:
对于||,只要有一个操作数为true,则结果为true;
对于&&,只要有一个操作数为false,则结果为false。
对于^,两个操作数不同,则结果为true,否则结果为false。
System.out.println(true&&true); System.out.println(true&&false); System.out.println(false&&true); System.out.println(false&&false); System.out.println("===================="); System.out.println(true||true); System.out.println(true||false); System.out.println(false||true); System.out.println(false||false); System.out.println("===================="); System.out.println(true^true); System.out.println(true^false); System.out.println(false^true); System.out.println(false^false); true false false false ==================== true true true false ==================== false true true false
注意:&&和||,
这两个运算符是所谓短路形式的逻辑运算符。假如单独根据左操作数就能确定表达式的结果,那么就不会计算右操作数的值。
int a = 5; int b = 6; if(a < b |++a == b) { System.out.println(a); } //运算结果6
int a = 5; int b = 6; if(a < b ||++a == b) { System.out.println(a); } //运算结果5
3.1.5 位运算符(了解)
3.1.5.1 左移与右移
1000 0010
(1)左移<<:低位补0,左移动1位,相当于乘以2
(2)右移>>:高位补符号位,右移1位,相当于除以2
(3)无符号右移>>>:高位补03.1.5.2 位逻辑运算符
运算符 | 结 果 |
---|---|
~ | 按位一元取反 |
& | 按位与 |
| | 按位或 |
^ | 按位异或 |
运算规则:
操作数 | 位运算及结果 | ||||
---|---|---|---|---|---|
A | B | A | B | A & B | A ^ B | ~A |
0 | 0 | 0 | 0 | 0 | 1 |
1 | 0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 | 0 |
注意:
&和|,如果操作数为boolean类型,则为逻辑运算符,如果操作数为整数则为位运算符。通常将&和|作为位运算符。
3.1.5.3 位运算符与赋值运算符的结合
例如:a >>= 4; 相当于a = a >> 4;
3.1.6 三目运算符(三元)
运算规则
表达式1 ? 表达式2: 表达式3
语法:表达式1?表达式2:表达式3
表达式1必须是boolean类型的表达式
如果结果为true,那么取表达式2的结果
如果结果为false,那么取表达式3的结果
int c = 666; int d = 777; int e = c > d ? 888 : 999 ; System.out.println(e); //输出结果999
int c = 666; int d = 777; int e = c < d ? 888 : 999 ; System.out.println(e); //输出结果888
大概顺序:算术运算符>移位运算符>关系运算符>逻辑运算符>赋值运算符
圆括号会提升其内部操作数的优先级。为了得到所期望的结果,这通常是必需的。圆括号(不管是否冗余)不会降低程序的性能。所以,为了减少模糊性而添加圆括号,不会对程序造成负面影响。
int c = 666; int d = 777; System.out.println(""+(c + d)); //输出结果1443
3.2流程控制-选择结构
顺序结构 一行一行顺序执行
选择结构 有选择的执行
循环结构 一行按照循环条件执行
选择结构是通过分支语句实现的,分支语句有两种。
3.2.1、 if-else
-
if语句的三种形式
if(a < b ||++a == b) { System.out.println(a); } ---------------------------- if (i>s){ System.out.println("最大的数是:"+i); }else { System.out.println("最大的数是:"+s); } ----------------------------- if (i == 100){ System.out.println("满分哦"); }else if(i >90 ){ System.out.println("不错呦,优秀"); }else if(i >80){ System.out.println("继续加油,还不错"); }else if(i >= 60){ System.out.println("要努力喽,不然挂科啦"); }else if(i < 60) { System.out.println("恭喜你,我们下次再见"); }
注意: else 不能单独使用,要和if配对使用 if else 都可以后面不跟{},但是只能控制下面的一行代码
3.3.2、多分支语句switch
3.3.2.1 switch语句的结构
switch (str){ case "+": System.out.println("a+b="+(a + b)); break; case "-": System.out.println("a-b="+(a - b)); break; case "*": System.out.println("a*b="+(a * b)); break; case "/": System.out.println("a/c="+(a / b)); break; case "%": System.out.println("a%b="+(a % b)); break; }
3.3.2.2 switch语句需要注意的问题
(1)switch(expression)中expression的结果必须是byte,short,char,int中的一种。 新增:枚举类型、String 不可以是long (2)在同一个switch语句中,两个case常量不允许具有相同的值 (3)每个case语句中需要加上break;语句。如果遗漏了break,则会继续进入到下一个case。 (4)可以省略default语句。 (5)default语句通常放在末尾,可以放在开始,中间或者末尾位置。
3.3.2.4、if-else与Switch的区别
(1)switch语句只能进行相等性测试,这一点与if语句不同,if语句可以对任何类型的布尔表达式进行求值。即,switch只查看表达式的值是否和某个case常量相匹配。 (2)相对于一系列嵌套的if语句,switch语句通常效率更高。 (3) switch能做的分支,if...else...一定能做。但是if...else...能做的分支,seitch不一定能做。