分类
- 算数运算符
- 赋值运算符
- 关系运算符
- 逻辑运算符
- 位运算符
- 条件运算符
算数运算符
运算符
- 二元运算符:+ - * / %
- 一元运算符:++ –
整数运算的潜规则
-
如果两个操作数有一个是长整型 long,那么最终的运算结果也是 long 类型。
-
没有 long 类型数据时,结果是 int 类型数据。即使操作数全是 short 或 byte,结果也是 int 类型。
-
代码实现
public class Code0 { public static void main(String[] args) { int typeInt = 10; byte typeByte = 1; short typeShort = 2; long typeLong = 200L; float typeFloat = 3.14f; double typeDouble = 6.28; char typeChar = 'a'; boolean typeBool = true; System.out.println("int 型:------ " + getType(typeInt)); System.out.println("byte 型:----- " + getType(typeByte)); System.out.println("short 型:---- " + getType(typeShort)); System.out.println("long 型:----- " + getType(typeLong)); System.out.println("float 型:---- " + getType(typeFloat)); System.out.println("double 型:--- " + getType(typeDouble)); System.out.println("char 型:----- " + getType(typeChar)); System.out.println("boolean 型:-- " + getType(typeBool) + '\n'); System.out.println("--------------- 开始计算 -----------------\n"); System.out.println(getType(typeByte + typeShort)); System.out.println(getType(typeInt + typeShort)); System.out.println(getType(typeInt + typeLong)); } // 返回数据类型 public static String getType(Object o) { return o.getClass().toString(); } }
浮点运算的潜规则
-
如果两个操作数有一个是 double,则结果为 double。
-
只有两个数都是 float 时,结果才是 float。
-
代码实现
public class Code0 { public static void main(String[] args) { int typeInt = 10; byte typeByte = 1; short typeShort = 2; long typeLong = 200L; float typeFloat = 3.14f; double typeDouble = 6.28; char typeChar = 'a'; boolean typeBool = true; System.out.println("int 型:------ " + getType(typeInt)); System.out.println("byte 型:----- " + getType(typeByte)); System.out.println("short 型:---- " + getType(typeShort)); System.out.println("long 型:----- " + getType(typeLong)); System.out.println("float 型:---- " + getType(typeFloat)); System.out.println("double 型:--- " + getType(typeDouble)); System.out.println("char 型:----- " + getType(typeChar)); System.out.println("boolean 型:-- " + getType(typeBool) + '\n'); System.out.println("--------------- 开始计算 -----------------\n"); System.out.println(getType(typeFloat + typeDouble)); System.out.println(getType(typeFloat + typeFloat)); } // 返回数据类型 public static String getType(Object o) { return o.getClass().toString(); } }
取余运算的潜规则
-
最终结果由被除数的符号决定。
-
例:
-
代码:
public class Code0 { public static void main(String[] args) { System.out.println(10 % 3); System.out.println(-10 % 3); System.out.println(10 % -3); System.out.println(-10 % -3); } }
-
运算结果:
-
自增自减的潜规则
-
前缀自增或自减(++a):先做加减法,再赋值。
-
后缀自增或自减(a++):先赋值,再做加减法。
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 10; int c = a++; int d = ++b; System.out.println("c = " + c + "\na = " + a); System.out.println("d = " + d + "\nb = " + b); } }
-
运行结果:
赋值运算符
赋值运算符
-
符号:=
-
说明:
int a = 10; int b = a + 10;
在上面代码中,第一行可以解释为定义一个 int 型变量 a,并将 10 赋给这个变量。第二行表示定义一个 int 型变量 b,并将 a + 10 的运算结果赋给变量 b。
扩展赋值运算符
-
符号:+= -= *= /= %=
-
说明:a += b 可以解释为 a = a + b,其他运算符也是一样。
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 3; System.out.println("a = " + a + ",b = " + b); a += b; System.out.println("a += b : " + a); a = 10; a -= b; System.out.println("a -= b : " + a); a = 10; a *= b; System.out.println("a *= b : " + a); a = 10; a /= b; System.out.println("a /= b : " + a); a = 10; a %= b; System.out.println("a %= b : " + a); } }
-
运行结果:
关系运算符
符号
==
: 等于!=
: 不等于>
: 大于>=
: 大于等于<
: 小于<=
: 小于等于
注意事项
- 由关系与算符连接的关系表达式的结果一定是布尔值。
- 一个等号表示赋值运算符,两个等号表示关系运算符。
- 等于和不等于运算符对所有数据类型的数据都可用。
- 除等于和不等于以外其他关系运算符只针对数值类型和字符类型的数据。
代码演示
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("a == b : " + (a == b)); System.out.println("a != b : " + (a != b)); System.out.println("a >= b : " + (a >= b)); System.out.println("a <= b : " + (a <= b)); System.out.println("a > b : " + (a > b)); System.out.println("a < b : " + (a < b)); char chr0 = 'a'; char chr1 = 'b'; System.out.println("字符比较 : " + (a > b)); } }
-
运行结果:
-
字符之间是通过 Unicode 十六进制码比较的。a 的十六进制码是 ‘\u0061’,b 的十六进制码是 ‘\u0062’,所以,b > a
逻辑运算符
说明
- 逻辑运算符的两侧必须为直接布尔值或间接布尔值。
- 直接布尔值:true 和 false。
- 间接布尔值:通过运算得到的布尔值。例如:关系表达式。
符号
&
: 与运算。全真为真,一假为假。|
: 或运算。一真为真,全假为假。!
: 非运算。非真为假,非假为真。&&
: 短路与运算。全真为真,一假为假。第一个值若为假,后面的值无需运算。推荐使用。||
: 短路或运算。一真为真,全假为假。第一个值若为真,后面的值无需运算。推荐使用。^
: 异或。全真全假为假,一假一真为真。
代码演示
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 20; System.out.println("true & true : " + (a > 0 & b > a)); System.out.println("true & false : " + (a > 0 & b < a)); System.out.println("true | false : " + (a > 0 | b < a)); System.out.println("false | false : " + (a < 0 | b < a)); System.out.println("!true : " + (!(a > 0))); System.out.println("!false : " + (!(b < a))); System.out.println("true && true : " + (a > 0 && b > a)); System.out.println("true && false : " + (a > 0 && b < a)); System.out.println("true || false : " + (a > 0 || b < a)); System.out.println("false || false : " + (a < 0 || b < a)); System.out.println("true ^ true : " + (a > 0 ^ b > a)); System.out.println("false ^ false : " + (a < 0 ^ b < a)); System.out.println("false ^ true : " + (a < 0 ^ b > a)); } }
-
运行结果:
关于短路
-
接下来用代码验证短路问题。
-
在程序中,当我们将除数设为 0 时,程序会报错,我们利用这一点验证一下短路与和短路或。
-
短路与
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a > 10 && b > (a / b)); } }
-
运行结果:
-
说明:
&&
左侧条件为 false,此时不再执行右侧的运算,这样在编译时就不会报错。
-
-
短路或
-
代码:
public class Code0 { public static void main(String[] args) { int a = 10; int b = 0; System.out.println(a > 0 || b > (a / b)); } }
-
运行结果:
-
说明:
||
左侧条件为 true,此时不再执行右侧的运算,这样在编译时就不会报错。
-
位运算符
说明
- 位运算,顾名思义对位进行运算。
- 通过转二进制数进行运算。
符号
~
: 取反。遇 1 转 0,遇 0 转 1。&
: 按位与运算。全 1 为 1,遇 0 为 0。|
: 按位或运算。遇 1 为 1,全 0 为 0。^
: 按位异或运算。全 0 全 1 为 0,一 0 一 1 为 1。<<
: 左移运算符。左移 n 为相当于乘 2n。>>
: 右移运算符。右移 n 为相当于除 2-n。
代码演示:
-
代码:
public class Code0 { public static void main(String[] args) { int a = 3; // int 类型 a 的二进制数为:0000,0000,0000,0000,0000,0000,0000,0011 int b = 4; // int 类型 b 的二进制数为:0000,0000,0000,0000,0000,0000,0000,0100 System.out.println("~ 取反运算 ~a : " + ~a); // 运算结果:1111,1111,1111,1111,1111,1111,1111,1100 转十进制为 -4 System.out.println("& 按位与运算 a & b : " + (a & b)); // 运算结果:0000,0000,0000,0000,0000,0000,0000,0000 转十进制为 0 System.out.println("| 按位或运算 a | b : " + (a | b)); // 运算结果:0000,0000,0000,0000,0000,0000,0000,0111 转十进制为 7 System.out.println("^ 按位异或运算 a ^ b : " + (a ^ b)); // 运算结果:0000,0000,0000,0000,0000,0000,0000,0111 转十进制为 7 System.out.println("<< 左移运算 a << 1 : " + (a << b)); // a << b = a * 2 ^ b = 3 * 2 * 2 * 2 * 2 = 48 System.out.println("<< 左移运算 a << 1 : " + (b >> 1)); // b >> 1 = b * 2 ^ (-1) = 2; } }
-
运行结果:
字符串连接符
说明
- 符号:+
- 在 + 两侧若有一个数据是字符串,那么这个 + 起到了连接符的作用,最后的到的结果也是一个字符串。
- 无论 + 左右是什么数据,程序的执行顺序是不变的,从上到下,从左到右。
代码演示
-
代码:
public class Code0 { public static void main(String[] args) { String a = "1"; int b = 2; int c = 3; System.out.println(a + b); System.out.println(b + c); System.out.println(a + b + c); System.out.println(b + c + a); } }
-
运行结果:
条件运算符
说明
- 条件运算符也叫三目运算符。
- 条件运算符中的条件决定运算结果的走向,也就是选择结构的一种。
格式
-
格式代码:
条件 ? 条件成立分支 : 条件不成立分支
-
代码:
public class Code0 { public static void main(String[] args) { int a = 5; int b = a > 0 ? 10 : 0; // 条件成立 System.out.println("a = " + a); System.out.println("b = " + b); } }
-
运算结果:
多分支语句
-
代码:
public class Code0 { public static void main(String[] args) { int stu0 = 95; int stu1 = 85; int stu2 = 75; int stu3 = 65; int stu4 = 55; System.out.println("分数:" + stu0 + ",等级:" + achievement(stu0)); System.out.println("分数:" + stu1 + ",等级:" + achievement(stu1)); System.out.println("分数:" + stu2 + ",等级:" + achievement(stu2)); System.out.println("分数:" + stu3 + ",等级:" + achievement(stu3)); System.out.println("分数:" + stu4 + ",等级:" + achievement(stu4)); } // 判断成绩等级 public static String achievement(int a) { return a >= 90 ? "优秀" : a >= 80 ? "良好" : a >= 60 ? "及格" : "不及格"; } }
-
运行结果: