1.运算符分类
- 算术运算符
- 关系运算符(比较运算符)
- 逻辑运算符
- 赋值运算符
- 三元运算符
- 位运算(需要二进制基础)
2.算术运算符
数值类型进行运算的
注意:
/:保留商部分
sout(10 / 4) //2,整数运算结果为整数
sout(10.0 / 4) //2.5,如果运算有一个位小数,那么运算结果一定是小数
中心思想:运算结果精确到最高位
double d = 10 / 2 //2.0 2->2.0%:保留余数部分
%本质:a % b = a - a / b b
sout(10 % 3) //1
sout(-10 % 3) //-1
sout(10 % -3) //1
sout(- 10 % -3) //-1
结论:取模符号只跟被除数有关
当a是小数,a%b=a-(int)a/bb++:i=i+1
前++和后++独立使用:i=i+1
作为表达式使用:
前++:++i 先自增后赋值
后++:i++ 先赋值后自增int j = 8;
int k= ++j; //j=j+1,k=j //9
int k= j++; //k=j,j=j+1 //8
—:i=i-1
类似++面试题
//第一题
int i = 1;
i=i++; //规则使用临时变量:①temp=i;②i=i+1;③i=temp
sout(i) //1
//第二题
int i = 1;
i=++i; //规则使用临时变量:①i=i+1;②temp=i;③i=temp
sout(i) //2
练习
```java double huaShi = 1234.6; double sheShi = 5.0 / 9 * (huaShi - 100); System.out.println(“华氏温度” + huaShi
- “ 对应的摄氏温度=” + sheShi); //如果是5/9那么结果为0,如果是5.0/9那么结果会保留小数
```
3.关系运算符(比较运算符)
介绍
1)关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false
2)关系表达式经常用在 if 结构的条件中或循环结构的条件中关系运算符一览
= 赋值 == 比较相等
常用6种 特殊一种:判断是否有一个实例是某类的对象:instanceof细节
1) 关系运算符的结果都是boolean型,也就是要么是 true,要么是 false。
2) 关系运算符组成的表达式,我们称为关系表达式。 a > b
3) 比较运算符”==”不能误写成”=”4.逻辑运算符
介绍:
用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean 值。逻辑运算符一览
分为两组学习
1) 短路与 && , 短路或 ||,取反 !
2) 逻辑与 &,逻辑或 |,^ 逻辑异或
说明逻辑运算规则:
1) a&b: 规则:当 a 和 b 同时为 true ,则结果为 true, 否则为 false
2) a&&b:规则:当 a 和 b 同时为 true ,则结果为 true,否则为 false
3) a|b : 规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
4) a||b: 规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false
5) !a : 叫取反,或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 true
6) a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
&& 和 & 基本规则
名称语法特点:
- 短路与&& 条件 1&&条件 2 两个条件都为 true,结果为 true,否则 false
- 逻辑与& 条件 1&条件 2 两个条件都为 true,结果为 true,否则 false
&& 和 & 使用区别:
1) &&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高
2) & 逻辑与: 不管第一个条件是否为 false,第二个条件都要判断,效率低
|| 和 | 基本规则
名称 语法 特点
- 短路或|| 条件 1||条件 2 两个条件中只要有一个成立,结果为 true,否则为 false
- |逻辑或 条件 1|条件 2 只要有一个条件成立,结果为 true,否则为 false
|| 和 | 使用区别:
1) ||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
2) | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
总结:
短路与&&,第一个条件为false,结果为false
短路或||,第一个条件为true,结尾为true
逻辑与&or逻辑或|,二个条件都要判断
逻辑与关系混搭:比较是否为真假,只要执行了++一定要自增;前++执行时自增,后++执行后自增
注意:=赋值,==相等,比较的结果就是真或假
取反基本规则
名 语法 特点 ! 非(取反) !条件 如果条件本身成立,结果为 false,否则为 true
逻辑异或
a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
sout( (4 < 1) ^ (6 > 3) ); // true
练习:
5.赋值运算符
介绍:
分类:
基本赋值运算符 =
- int a = 10;
复合赋值运算符
+= ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理
int num = 20; int num2= 78 * 34 - 10; int num3 = a;
3) 复合赋值运算符等价于下面的效果
比如:a+=3;等价于 a=a+3; 其他类推
4) 复合赋值运算符会进行类型转换。
byte b = 2; b+=3; b++;
总结:
运算顺序从右到左;赋值左变右全,
b+=3和b++隐藏强制类型转换
byte b = 2;
b+=3; 等价b = (byte)(b+3)
b++; 等价b = (byte)(b+1)
6.三元运算符
运算规则:
- 如果条件表达式为 true,运算后的结果是表达式 1;
2. 如果条件表达式为 false,运算后的结果是表达式 2;
口诀: [一灯大师: 一真大师]
使用细节 :
1) 表达式 1和表达式 2要为可以赋给接收变量的类型(或可以自动转换or强制转换)
2) 三元运算符可以转成 if—else 语句
总结:
三元运算一真,二假
三元左右类型相等(or自动转换or强制转换)
三元和if-else可以互换
练习:
求最大值:
int n1 = 55;
int n2 = 33;
int n3 = 123;
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);
7.运算符优先级
1) 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
2) 只有单目运算符、赋值运算符是从右向左运算的。
3) 一览表, 不要背,使用多了,就熟悉了.
8.标识符的命名规则和规范
标识符的命名规则
总结:
标识符的命名规范
1) 包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm
2) 类名、接口名:多单词组成时,所有单词的首字母大写:
XxxYyyZzz [大驼峰]
比如: TankShotGame
3) 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小
驼峰, 简称 驼峰法]
,比如: tankShotGame
4) 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ
比如 :定义一个所得税率 TAX_RATE
5) 后面我们学习到 类,包,接口,等时,我们的命名规范要这样遵守,更加详细的看文档.
总结:
大驼峰:类名、接口
小驼峰:变量名、方法名
所有字母大写:常量名(.连接)
所有字母小写:包名(_连接)
9.关键字
键字的定义和特点 ( 不用背)
定义:被 Java 语言赋予了特殊含义,用做 专门用途的字符串(单词)
特点:关键字中所有字母都为小写
10.保留字
介绍:
Java 保留字:现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。
自己命名标识符时要避免使用这些保留
字 byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
11. 键盘输入语句(重要)
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。Input.java , 需要一个 扫描器(对象), 就是 Scanner
步骤 :
1) 导入该类的所在包, java.util.*
2) 创建该类对象(声明变量)
3) 调用里面的功能
经典练习题(重要)
要求:从控制台接收用户信息(姓名,年龄,薪水)12
import java.util.Scanner;
public class Input{
public static void main(String[] args){
//System.in从键盘输入
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
//next方法:1.等待用户输入,2.接收用户输入数据
String name = myScanner.next();
System.out.println("请输入年龄");
int age = myScanner.nextInt();
System.out.println("请输入薪水");
double sal = myScanner.nextDouble();
System.out.println("人的信息如下:");
System.out.println("名字=" + name
+ " 年龄=" + age + " 薪水=" + sal);
}
}
总结:
键盘输入:
创建对象并且从键盘输入Scanner(System.in)
调用方法next()并且用一个变量接收【字符串调用next(),其他七种nextXxx(),比如nextInt()】
12.进制(程序员的基本功)
进制介绍
对于整数,有四种表示方式:
二进制: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 不区分大小写。
课堂练习:
int n1 = 0b1010;
int n2 = 1010;
int n3 = 01010;
int n4 = 0x10101;
System.out.println("n1=" + n1);
System.out.println("n2=" + n2);
System.out.println("n3=" + n3);
System.out.println("n4=" + n4);
总结:
13.进制图示:
14. 进制的转换(基本功)
第一组:
1) 二进制转十进制
2) 八进制转十进制
3) 十六进制转十进制
第二组:
1) 十进制转二进制
2) 十进制转八进制
3) 十进制转十六进制
第三组
1) 二进制转八进制
2) 二进制转十六进制
第四组
1) 八进制转二进制
2) 十六进制转二进制
进制转换
一、二八十六进制转十进制
15.二进制转十进制
算数步骤:
0b1011=12^(1-1)+12^(2-1)+02^(3-1)+12^(4-1)=1+2+0+8=11
总结:
二进制转十进制
0或1*2^(位数-1)
16.八进制转十进制
算数步骤:
0234=48^(1-1)+38^(2-1)+28^(3-1)=4+24+128=156
总结:
八进制转十进制
位数的数8^(位数-1)
计算顺序:先指数后乘法0
17.十六进制转十进制
规则:
从最低位(右边)开始,将每个位上的数提取出来,乘以 16 的(位数-1)次方,然后求和。
案例:
请将 0x23A 转成十进制的数
0x23A=1016^(1-1)+316^(2-1)+2*16^(3-1)=10+48+512=570
课堂练习:
0b110001100 转十进制 396
02456 转十进制 1326
0xA45 转十进制 2629
二、十进制转二八十六进制
18.十进制转二进制
规则:
将该数不断除以 2,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:
请将 34 转成二进制 =>0B00100010 (一个字节8位)
19.十进制转八进制
规则:
将该数不断除以 8,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的八进制。
案例:
20.十进制转十六进制
规则:
将该数不断除以 16,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的十六进制。 案例:请将 237
案例:
课堂练习:
123 转成 二进制 => 0b01111011
678 转成 八进制 => 01246
8912 转成 十六进制 => 0x22D0
三、二进制转八十六进制
21.二进制转八进制
规则:
从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
111=7 000=0
案例:
请将 ob11010101 转成八进制
ob11(3)010(2)101(5) => 0325
22. 二进制转十六进制
规则:
从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
0000=0 1111=F
案例:
请将 ob11010101 转成十六进制
ob1101(D)0101(5) = 0xD5
课堂练习:
0b11100101 转成 八进制 => 0345
0b1110010110 转成 十六进制 => 0x396
四、八十六进制转二进制
23.八进制转二进制
规则:
将八进制数每 1 位,转成对应的一个 3 位的二进制数即可。
7=111 0=000
案例:
请将 0237 转成二进制
02(010)3(011)7(111) = 0b10011111
规则:
将十六进制数每 1 位,转成对应的 4 位的一个二进制数即可。
0=0000 F=1111
案例:
请将 0x23B 转成二进制
0x2(0010)3(0011)B(1011) = 0b001000111011
课堂练习:
01230 转成 二进制 => 0b001010011000
0xAB29 转成二进制 => 0b1010101100101001
25.位运算的思考题
1) 请看下面的代码段,回答 a,b,c,d,e 结果是多少?
public static void maiin(String []args){
int a=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);//0
System.out.println("b="+b);//-1
System.out.println("c="+c);//4
System.out.println("d="+d);//-4
System.out.println("e="+e);//0
}
2) 请回答在 java 中,下面的表达式运算的结果是: (位操作), 晚上练习
~2=? //-3 按位取反
2&3=//2 按位与
2|3=//3
~-5=//4
13&7=//5
5|4=//5
-3^3=//-2 按位异或
26.二进制在运算中的说明
27 原码、反码、补码(重点 难点)
总结:
最高位:0=>正数 1=>负数(口诀:0旋转90度还是0,1旋转90度还-)
正数:正数三码合一
负数原码变反码:原码符号位不变,其余1变0,0变1
补码=反码+1
0的反码补码都是0
补码运算,原码结果(正数三码合一,负数补码+1,0的反码补码都是0)
理解总结:
0是正,1是负
正数:三码合一
负数三码:最高位符号位不变,其余0变1,1变0
负数补码=反码+1
补码运算,原码结果
28.位运算符
java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)
a.&、|、^、~
做好25练习:
b.还有 3 个位运算符 >>、<< 和 >>>
运算规则:
1) 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
2) 算术左移 <<: 符号位不变,低位补 0
3) >>> 逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0
4) 特别说明:没有 <<< 符号
总结:
右移补符号位,左移动补0
无符号右移补0
m<
总结:负数的无符号右移,就是相应的补码移位所得,在高位补0即可。
负数的右移,就是补码高位补1,然后按位取反加1即可。
应用案例
BitOperator02.java
1) int a=1>>2; //1 => 00000001 => 00000000 本质 1 / 2 / 2 =0
2) int c=1<<2; //1 => 00000001 => 00000100 本质 1 2 2 = 4
做好25练习
本章作业
a%b=a-a/b*b
当a是小数,a%b=a-(int)a/b*b
-10.5%3=-1.5
3d代表double类型的3