第四章 运算符
第四章 运算符
4.1 运算符介绍
4.1.1 运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
-
算术运算符 -
赋值运算符 -
关系运算符 [比较运算符] -
逻辑运算符 -
位运算符 [需要二进制基础] -
三元运算符
4.2 算术运算符
4.2.1 介绍
算术运算符是对数值类型的变量进行运算的,在 Java 程序中使用的非常多。
4.2.2 算术运算符一览
4.2.3 案例演示
/**
-
@program: Chapter04
-
@description: 算术运算符的使用
-
@author: 叶清誠
-
@create: 2021-04-01 08:18
**/
public class ArithemeticOperator {
public static void main(String[] args) {
//使用
//数学中是2.5,java中是2
System.out.println(10 / 4);
//结果是2.5
System.out.println(10.0 / 4);
double number = 10 / 4;
//结果是2.0
System.out.println(number);//% 取模,取余 //%的本质 a % b = a - a / b * b; //-10 % 3 -> -10-(-10/3)*3 = -1 //-10 % -3 -> -10-(-10/-3)*(-3) = -1 //结果是1 System.out.println(10 % 3); //结果是-1 System.out.println(-10 % 3); //结果是-1 System.out.println(-10 % -3); //结果是1 System.out.println(10 % -3); //++的使用 int i =10; i++;//自增,相当于i = i + 1; ++i;//自增,相当于i = i + 1; //i = 12 System.out.println(i); /* 作为表达式使用 前++:++i先自增后赋值 后++: i++先赋值后自增 */ int j = 8; //等价于 j =j+1;k=j int k = ++j; //等价于 k=j;j =j+1; int n = j++; System.out.println(k); System.out.println(n);}
}
4.2.4 细节说明
4.2.5
4.2.6 自增自减练习
/**
-
@program: Chapter04
-
@description: 算术运算符练习
-
@author: 叶清誠
-
@create: 2021-04-01 08:45
**/
public class ArithemeticOperatorExercise02 {
public static void main(String[] args) {
int days = 59;
int weeks = 59 / 7;
int leftDays = 59 % 7;
System.out.println(days + "天" + "合" + weeks + "个星期" + "零" + leftDays + "天");double huaShi = 1234.5; double sheShi = 5.0 / 9 * (huaShi - 100); System.out.println("华氏温度" + huaShi + "对应的摄氏温度是" + sheShi);}
}
4.3 关系运算符(比较运算符)
4.3.1
- 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false
- 关系表达式 经常用在 if 结构的条件中或循环结构的条件中
4.3.2关系运算符一览
4.3.3 案例演示
/**
- @program: Chapter04
- @description: 关系运算符的使用
- @author: 叶清誠
- @create: 2021-04-01 08:57
**/
public class RelationalOperator {
public static void main(String[] args) {
int a = 9;//正式开发中不可以a,b
int b = 8;
System.out.println(a > b);//T
System.out.println(a >= b);//F
System.out.println(a < b);//F
System.out.println(a <= b);//F
System.out.println(a == b);//F
System.out.println(a != b);//T
}
}
4.3.4 细节说明
- 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false。
- 关系运算符组成的表达式,我们称为关系表达式。 a > b
- 比较运算符"=="不能误写成"="
4.4 逻辑运算符
4.4.1 介绍
- 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false。
- 关系运算符组成的表达式,我们称为关系表达式。 a > b
- 比较运算符"=="不能误写成"="
4.4.2 逻辑运算符一览
说明逻辑运算规则:
- a&b : & 叫逻辑与:规则:当 a 和 b 同时为 true ,则结果为 true, 否则为 false
- a&&b : && 叫短路与:规则:当 a 和 b 同时为 true ,则结果为 true,否则为 false
- a|b : | 叫逻辑或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
- a||b : || 叫短路或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
- !a : 叫取反,或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 true
- a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
4.4.3 案例演示
package com.yeqingcheng.java;
/**
-
@program: Chapter04
-
@description: 逻辑运算符的使用
-
@author: 叶清誠
-
@create: 2021-04-01 09:01
**/
public class LogicOperator01 {
public static void main(String[] args) {
int age = 50;
if (age > 20 && age < 30) {
System.out.println("ok");
}//&逻辑与使用 if (age > 20 & age < 60) { System.out.println("111"); } //区别 int a = 4; int b = 9; //对于&&短路与,第一个条件为flase,第二个条件不会判断 if (a < 3 && ++b < 50) { System.out.println("ok300"); } System.out.println("a= " + a + ",b=" + b); //对于&逻辑与,第一个条件为flase,第二个条件会判断 if (a < 1 & ++b < 50) { System.out.println("ok300"); } System.out.println("a= " + a + ",b=" + b);}
}
4.4.4 &&与&区别
- &&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高
- & 逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低
3)开发中,我们一般都使用短路与,效率高
4.4.5 ||和|基本规则
名称 语法 特点
短路或|| 条件 1||条件 2 两个条件中只要有一个成立,结果为 true,否则为 false
|逻辑或 条件 1|条件 2 只要有一个条件成立,结果为 true,否则为 false
4.4.6 案例基本演示
package com.yeqingcheng.java;
/**
-
@program: Chapter04
-
@description: 逻辑运算符的使用2
-
@author: 叶清誠
-
@create: 2021-04-01 09:09
**/
public class LogicOperator {
public static void main(String[] args) {
//短路或||和逻辑或|的使用
int age = 50;
if (age > 20 || age < 30) {
System.out.println("ok100");
}if (age > 20 | age < 30) { System.out.println("ok200"); } //看看区别 //(1)||短路或:如果第一个条件为 true, //则第二个条件不会判断,最终结果为 true,效率高 //(2)| 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低 int a= 4; int b=9; if(a>1 || ++b>4){ System.out.println("ok"); } //a=4 b=9 System.out.println("a="+a+",b="+b);}
}
4.4.7 ||与|区别
- ||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
- | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
- 开发中,我们基本使用 ||
4.4.8 !取反基本规则
如果条件本身成立,结果为false,否则为true
a^b叫逻辑异或,当a和b不同时结果为true,否则为false
4.4.9 案例演示
package com.yeqingcheng.java;
/**
-
@program: Chapter04
-
@description: !和^案例演示
-
@author: 叶清誠
-
@create: 2021-04-01 09:17
**/
public class InverseOperator {
public static void main(String[] args) {
//!操作是取反 T->F F->T
//true
System.out.println(60 > 20);
//false
System.out.println(!(60 > 20));//a^b 逻辑异或 当a和b不同时,结果为true boolean b = (10 > 1) ^ (2 > 3); System.out.println(b);}
}
4.4.10 练习题
4.4.11 练习题2
4.5 赋值运算符
4.5.1 赋值运算符就是将某个运算后的值,赋给变量
4.5.2 分类
基本赋值运算符 = int a = 10;
复合赋值运算符
+= ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理
a += b; [等价 a = a + b; ]
a -= b; [等价 a = a - b; ]
4.5.3 特点
- 运算顺序从右往左
int num = a + b + c; - 赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
int num = 20; int num2= 78 * 34 - 10; int num3 = a; - 复合赋值运算符等价于下面的效果
比如:a+=3;等价于 a=a+3; 其他类推 - 复合赋值运算符会进行类型转换。
byte b = 2; b+=3; b++;
package com.yeqingcheng.java;
/**
-
@program: Chapter04
-
@description: 赋值运算符的使用
-
@author: 叶清誠
-
@create: 2021-04-01 09:25
**/
public class AssignOperator {
public static void main(String[] args) {
int n1 = 10;
//n1=n1+4;
n1 += 4;
System.out.println(n1);//复合赋值运算符会进行类型转换 byte b = 3; //等价与 b = (byte)(b+2); b += 2; System.out.println(b);}
}
4.6三元运算符
4.6.1 基本语法
条件表达式 ? 表达式 1: 表达式 2;
运算规则:
- 如果条件表达式为 true,运算后的结果是表达式 1;
- 如果条件表达式为 false,运算后的结果是表达式 2;
口诀:一真大师
4.6.2 案例演示
package com.yeqingcheng.java;
/**
- @program: Chapter04
- @description: 三元运算符的使用
- @author: 叶清誠
- @create: 2021-04-01 09:31
**/
public class TernaryOpetator {
public static void main(String[] args) {
int a = 10;
int b = 99;
//a>b为false,返回b--
int result = a > b ? a++ : b--;
//result = 99
System.out.println(result);
}
}
4.6.3 使用细节
- 表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)
- 三元运算符可以转成 if--else 语句
int res = a > b ? a++ : b--;
if(a>b) res = a++;
else res = b--;
package com.yeqingcheng.java;
/**
- @program: Chapter04
- @description: 三元运算符的使用细节
- @author: 叶清誠
- @create: 2021-04-01 09:33
**/
public class TenaryOperator {
public static void main(String[] args) {
//表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换/强制转换)
int a =3;
int b=8;
int c=a>b?a:b;
//c=8
System.out.println(c);
double d = a > b ? a : b+3;
//11.0
System.out.println(d);
}
}
4.6.4 使用细节
package com.yeqingcheng.java;
/**
-
@program: Chapter04
-
@description: 实现三个数的最大值
-
@author: 叶清誠
-
@create: 2021-04-01 09:43
**/
public class TenaryOperatorExercise {
public static void main(String[] args) {
int n1 = 123;
int n2 = 1234;
int n3 = 4567;
//思路
//1.先得到n1,n2的最大值,保存到max1中
//2.然后再求出max1和n3的最大值,保存到max2中
int max1 = n1 > n2 ? n1 : n2;
int max2 = max1 > n3 ? max1 : n3;
System.out.println(max2);//一部到位的写法 int max = ((n1 > n2) ? n1 : n2) > n3 ? ((n1 > n2) ? n1 : n2) : n3; System.out.println(max);}
}
4.7 运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算的。
4.8标识符的命名规则和规范
4.8.1 判断下列变量名是否正确
hsp
//ok
hsp12 //ok
1hsp
//错误, 数字不能开头
h-s // 错误
, 不能有 -
x h // 错误, 有空格
h$4 // ok
class //错误,class 关键字
int // 错误 ,int 是关键字
double //错误 ,double 是关键字
public //错误 ,public 是关键字
static //错误 ,static 是关键字
goto //错误, goto 是保留字
stu_name //ok
4.8.2 标识符命名规范[更加专业]
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz [大驼峰]
比如: TankShotGame - 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小
驼峰, 简称 驼峰法]
比如: tankShotGame - 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
比如 :定义一个所得税率 TAX_RATE - 后面我们学习到 类,包,接口,等时,我们的命名规范要这样遵守,更加详细的看文档.
4.9 关键字
定义:被 Java 语言赋予了特殊含义,用作专门用途的字符串(单词)
特点:关键字中所有字母都为小写
4.10 保留字
Java 保留字:现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留
字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
4.11 键盘输入语句
4.11.1
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。Input.java , 需要一个 扫描器(对象), 就是
Scanner
4.11.2 步骤
- 导入该类的所在包, java.util.*
- 创建该类对象(声明变量)
- 调用里面的功能
package com.yeqingcheng.java;
import java.util.Scanner;
/**
- @program: Chapter04
- @description: 键盘输入
- @author: 叶清誠
- @create: 2021-04-01 19:56
**/
public class Input {
public static void main(String[] args) {
//演示接受用户的输入
//步骤
//Scanner 类 表示 简单文本扫描器,在 java.util 包
//1. 引入/导入 Scanner 类所在的包
//2. 创建 Scanner 对象 , new 创建一个对象,体会
// myScanner 就是 Scanner 类的对象
Scanner scanner = new Scanner(System.in);
System.out.println("请输入名字");
//当程序执行到 next 方法时,会等待用户输入~~~
String name = scanner.next();
System.out.println("请输入年龄");
int age = scanner.nextInt();
System.out.println("请输入薪水");
double salary = scanner.nextDouble();
System.out.println("人的信息如下");
System.out.print("名字:" + name + ",年龄:" + age + ",薪水:" + salary);
}
}
4.12进制
4.12.1 进制基本介绍
对于整数,有四种表示方式:
二进制:0,1 ,满 2 进 1.以 0b 或 0B 开头。
十进制:0-9 ,满 10 进 1。
八进制:0-7 ,满 8 进 1. 以数字 0 开头表示。
十六进制:0-9 及 A(10)-F(15),满 16 进 1. 以 0x 或 0X 开头表示。此处的 A-F 不区分大小写。
4.12.2 基本演示
package com.yeqingcheng.java;
/**
- @program: Chapter04
- @description: 演示四种进制
- @author: 叶清誠
- @create: 2021-04-01 09:58
**/
public class BinaryTest {
public static void main(String[] args) {
// n1 二进制
int n1 = 0b1010;
//n2 十进制
int n2=1010;
//n3 八进制
int n3 = 01010;
//n4 16进制
int n4 = 0x10101;
System.out.println(n1);
System.out.println(n2);
System.out.println(n3);
System.out.println(n4);
}
}
4.13 进制图示
4.14 进制转换
4.14.1 进制转换基本结束
第一组:
- 二进制转十进制
- 八进制转十进制
- 十六进制转十进制
l 第二组: - 十进制转二进制
- 十进制转八进制
- 十进制转十六进制
l 第三组 - 二进制转八进制
- 二进制转十六进制
l 第四组 - 八进制转二进制
- 十六进制转二进制
4.15 二进制转换成十进制
0b1011=12的零次方+12的1次方+0+1*2的三次方=1+2+8=11
4.16 八进制转换成十进制
0234=480+3*81+28^2=4+24+128=156
4.17 十六进制转化为十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数-1)次方,然后求和。
案例:请将 0x23A 转成十进制的数
0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570
课堂练习:
0b110001100=396
02456=1326
0xA45=2629
4.18 十进制转化为2进制
规则:将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:请将 34 转成二进制
= 0B00100010
4.19 十进制转化为8进制
规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制
131=0203
4.20 十进制转化为十六进制
规则:将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制
237=0Xed
课堂练习
123=0B1111011
678=01246
8912=0x22d0
4.21 二进制转化为8进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
案例:请将 ob11010101 转成八进制
ob11010101=0325
4.22二进制转化为十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
案例:请将 ob11010101 转成十六进制
ob11010101=0xd5
4.23 八进制转化为二进制
规则:将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
案例:请将 0237 转成二进制
0237=0b10011111
4.24 十六进制转化为二进制
规则:将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。
案例:请将 0x23B 转成二进制
0x23B=0b1000111011
课堂练习:
01230=0b1010011
0xAB29=0b1010101100101001
4.25 位运算符
public static void maiin(String []args)
{
int a=1>>2; // 1 向右位移 2 位
int b=-1>>2;//算术右移
int c=1<<2;//算术左移
int d=-1<<2;//
int e=3>>>2;//无符号右移
//a,b,c,d,e 结果是多少
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
}
2) 请回答在 java 中,下面的表达式运算的结果是: (位操作), 晚上练习
~2=? //
按位取反
2&3=?// 2 按位与 3
2|3=?
~-5=?
13&7=?
5|4=?
-33=?// 按位异或
4.26 二进制在运算中的说明
4.27 原码、反码、补码(重点 难点)
4.28 位运算符
4.28.1 java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>
//先得到2的原码 2的原码是00000000 00000000 00000000 00000010
//正数原码,反码补码相同,2的补码是00000000 00000000 00000000 00000010
//同理3的补码是00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000010
00000000 00000000 00000000 00000011
00000000 00000000 00000000 00000010 运算后的原码
//可以推出2&3=2
2&3=2
// -2 的原码是10000000 00000000 00000000 00000010
//-2的反码是 11111111 11111111 11111111 11111101
//-2的补码是11111111 11111111 11111111 11111110
// ~-2操作 00000000 00000000 00000000 00000001
//运算后的原码是 00000000 00000000 00000000 00000001
//结果是1
System.out.println(~-2);//?
- 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移 <<: 符号位不变,低位补 0
-
逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0
- 特别说明:没有 <<< 符号
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000000
int a=1>>2;//相当于1/2/2=0
//00000000 00000000 00000000 00000001
//00000000 00000000 00000000 00000100
int c=1<<2;相当于122
System.out.println(4<<3)//422*2=32
System.out.println(15>>2)//15/2/2=3
4.29 作业
浙公网安备 33010602011771号