提示:此为本人学习笔记
第3章 运算符
3.1 运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
运算符有:
- 算术运算符
- 赋值运算符
- 关系运算符 [比较运算符]
- 逻辑运算符
- 位运算符 [需要二进制基础]
- 三元运算符
3.2 算术运算符
算术运算符是对数值类型的变量进行运算的,在 Java 程序中使用的非常多。
/*** 演示算术运算符的使用 */
public class ArithmeticOperator {
//编写一个 main 方法
public static void main(String[] args) {
//使用
System.out.println(10 / 4); //从数学来看是 2.5, java 中 2
System.out.println(10.0 / 4); //java 是 2.5
double d = 10 / 4;//java 中 10 / 4 = 2, 2=>2.0
System.out.println(d);// 是 2.0
/* % 取模 ,取余
在 % 的本质 看一个公式!!!! a % b = a - a / b * b
-10 % 3 => -10 - (-10) / 3 * 3 = -10 + 9 = -1
10 % -3 = 10 - 10 / (-3) * (-3) = 10 - 9 = 1
-10 % -3 = (-10) - (-10) / (-3) * (-3) = -10 + 9 = -1
*/
System.out.println(10%3); //1
System.out.println(-10 % 3); // -1
System.out.println(10 % -3); //1
System.out.println(-10 % -3);//-1
// ++的使用
int i = 10;
i++;//自增 等价于 i = i + 1; => i = 11
++i;//自增 等价于 i = i + 1; => i = 12
System.out.println("i=" + i);//12
/* 作为表达式使用
前++:++i 先自增后赋值
后++:i++先赋值后自增 */
int j = 8;
int k = ++j; //等价 j=j+1;k=j;
int k = j++; // 等价 k =j;j=j+1;
System.out.println("k=" + k + "j=" + j);//8 9
}
}
1.对于除号" / ",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
2. 当对一个数取模(%)时,可以等价a % b = a - a / b * b
,这样我们可以看到取模的一个本质运算。
3. 当自增当做一个独立语言使用时,++i 等价于 i++;
思考:
// 1.
int i = 10;
i = i++;
System.out.println(i); //结果是?
// 2.
int j = 10;
j = ++j;
System.out.println(j); //结果是?
3.3 关系运算符(比较运算符)
- 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false
- 关系表达式 经常用在 if 结构的条件中或循环结构的条件中
演示:
//演示关系运算符的使用
public class RelationalOperator {
//编写一个 main 方法
public static void main(String[] args) {
int a = 9;
int b = 8;
System.out.println(a > b); //T
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); //T
boolean flag = a > b; //T
System.out.println("flag=" + flag);
- 关系运算符的结果都是 boolean 型,也就是要么是 true,要么是 false。
- 关系运算符组成的表达式,我们称为关系表达式。 a > b
- 比较运算符"==“不能误写成”="
3.4 逻辑运算符
用于连接多个条件(多个关系表达式),最终的结果也是一个 boolean 值。
- 短路与 && , 短路或 ||,取反 !
- 逻辑与 &,逻辑或 |,^ 逻辑异或
说明逻辑运算规则:
a&b
: & 叫逻辑与:规则:当 a 和 b 同时为 true ,则结果为 true, 否则为 falsea&&b
: && 叫短路与:规则:当 a 和 b 同时为 true ,则结果为 true,否则为 falsea|b
: | 叫逻辑或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 falsea||b
: || 叫短路或,规则:当 a 和 b ,有一个为 true ,则结果为 true,否则为 false!a
: 叫取反,或者非运算。当 a 为 true, 则结果为 false, 当 a 为 false 是,结果为 truea^b
: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
3.4.1 && 和 & 基本规则
名称 | 语法 | 特点 |
---|---|---|
短路与&& | 条件 1&&条件 2 | 两个条件都为 true,结果为 true,否则 false |
逻辑与& | 条件 1&条件 2 | 两个条件都为 true,结果为 true,否则 false |
&& 和 & 使用区别
- &&短路与:如果第一个条件为 false,则第二个条件不会判断,最终结果为 false,效率高
- &逻辑与:不管第一个条件是否为 false,第二个条件都要判断,效率低
3.4.2 || 和 | 基本规则 名称 语法 特点
名称 | 语法 | 特点 |
---|---|---|
短路或 ll | 条件 1 ll 条件 2 | 两个条件中只要有一个成立,结果为 true,否则为 false |
逻辑或 l | 条件 1 l 条件 2 | 只要有一个条件成立,结果为 true,否则为 false |
|| 和 | 使用区别
- ||短路或:如果第一个条件为 true,则第二个条件不会判断,最终结果为 true,效率高
- | 逻辑或:不管第一个条件是否为 true,第二个条件都要判断,效率低
- 开发中,我们基本使用 ||
3.4.3 !取反 基本规则
名称 | 语法 | 特点 |
---|---|---|
! 非(取反) | !条件 | 如果条件本身成立,结果为 false,否则为 true |
3.4.4 ^ 逻辑异或
a^b: 叫逻辑异或,当 a 和 b 不同时,则结果为 true, 否则为 false
^逻辑异或,System.out.println( (4 < 1) ^ (6 > 3) ); // ?
3.4.5 练习
3.5 赋值运算符
赋值运算符就是将某个运算后的值,赋给指定的变量。
基本赋值运算符 = int a = 10;
复合赋值运算符 += ,-= ,*= , /= ,%= 等 , 它们的使用是一个道理的
a += b; [等价 a = a + b; ]
a -= b; [等价 a = a - b; ]
赋值运算符特点
- 运算顺序从右往左 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++;
3.6 三元运算符
基本语法: 条件表达式 ? 表达式 1 : 表达式 2
;
运算规则:
- 如果条件表达式为 true,运算后的结果是表达式 1;
- 如果条件表达式为 false,运算后的结果是表达式 2;
注意:
- 表达式 1 和表达式 2 要为可以赋给接收变量的类型(或可以自动转换)
- 三元运算符可以转成 if–else 语句
3.7 运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算的。
- 一览表, 不要背,使用多了,就熟悉了
3.8 标识符的命名规则和规范
凡是自己可以起名字的地方都叫标识符
标识符的命名规则(必须遵守):
1.由26个英文字母大小写,0-9,或$组成
2. 数字不可以开头。int 3ab =1;/错误
3. 不可以使用关键字和保留字,但能包含关键字和保留字。
4. Java中严格区分大小写,长度无限制。int totalNum = 10; int n = 90;
5.标识符不能包含空格。int a b = 90;
标识符命名规范[更加专业]
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc //比如 com.hsp.crm
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz [大驼峰] 比如: TankShotGame
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小 驼峰, 简称 驼峰法] 比如: tankShotGame
- 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ 比如 :定义一个所得税率 TAX_RATE
- 后面我们学习到 类,包,接口,等时,我们的命名规范要这样遵守,更加详细的看文档
3.9 关键字
被 Java 语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:关键字中所有字母都为小写
3.10 保留字
现有 Java 版本尚未使用,但以后版本可能会作为关键字使用。
byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
3.11 键盘输入语句
步骤 :
- 导入该类的所在包, java.util.*
- 创建该类对象(声明变量)
- 调用里面的功能
import java.util.Scanner;//表示把 java.util 下的 Scanner 类导入 public class Input {
//编写一个 main 方法
public static void main(String[] args) {
//演示接受用户的输入
//步骤
//Scanner 类 表示 简单文本扫描器,在 java.util 包
//1. 引入/导入 Scanner 类所在的包
//2. 创建 Scanner 对象 , new 创建一个对象,
Scanner myScanner = new Scanner(System.in);
//3. 接收用户输入了, 使用 相关的方法
System.out.println("请输入名字");
//当程序执行到 next 方法时,会等待用户输入~~~
String name = myScanner.next(); //接收用户输入字符串
System.out.println("请输入年龄");
int age = myScanner.nextInt(); //接收用户输入 int
System.out.println("请输入薪水");
double sal = myScanner.nextDouble();
//接收用户输入
double System.out.println("人的信息如下:");、
System.out.println("名字=" + name + " 年龄=" + age + " 薪水=" + sal);
}
}
3.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 不区分大小写)
3.12.1 进制转换的介绍
其他进制转换成十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2【八进制就乘8】的(位数-1)次方,然后求和。
例:0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570
//练习:
0b110001100 转成 十进制
02456 转成十进制
0xA45 转成十进制
十进制转换成其他进制
规则:将该数不断除以 2【八进制就是除以8】,直到商为 0 为止,然后将每步得到的余数倒过来,就是对应的二进制。
练习:
123 转成 二进制 => ?
678 转成八进制 => ?
8912 转成十六进制 => ?
二进制转换成八进制、十六进制
规则:从低位开始,将二进制数每三位【四位】一组,转成对应的八进制【十六进制】数即可。
案例:
ob11(3)010(2)101(5) => 0325
ob1101(D)0101(5) = 0xD5
八进制、十六进制转换成二进制
规则:将八进制【十六进制】数每 1 位,转成对应的一个 3 位【4位】的二进制数即可
练习:请将
01230 转成 二进制
0xAB29 转成二进制
3.12.2 位运算的思考题
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=? // 按位取反
2&3=?// 2 按位与 3
2|3=?
~-5=?
13&7=?
5|4=?
3.13 原码、反码、补码(重点 难点)
对于有符号的而言:
- 二进制的最高位是符号位:0表示正数, 1表示负数(老韩口诀: 0->01-> -)
- 正数的原码,反码,补码都一样(三码合一)
- 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
- 负数的补码=它的反码+1,负数的反码=负数的补码-1
- O的反码,补码都是0
- java没有无符号数,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式来运算的.
- 当我们看运算结果的时候,要看他的原码(重点)
Java的数都是有符号的
3.14 位运算符
java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)
有 3 个位运算符 >>、<< 和 >>> , 运算规则:
- 算术右移
>>
:低位溢出,符号位不变,并用符号位补溢出的高位- 算术左移
<<
: 符号位不变,低位补 0>>>
逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0- 特别说明:没有
<<<
符号
3.15 本章练习
1.计算下列表达式的结果
10/3 = 3 ; 10/5 = 2 ; 10%2=0 ; -10.5%3 = ?;
//a % b当a是小数时,公式= a- (int)a / b *b
//-10.5%3 = -10.5 -(-10)/3 * 3= -10.5+9= -1.5
//注意:有小数运算,得到结果是近似值
2.试写出将String转换成double类型的语句,以及将char类型转换成String的语句,举例说明即可,写简单代码
String str = "18.8";//注意字符串要可以被转成double
double d1 = Double.parseDouble(str);
char c1 ='韩";
String str2 =c1 +"";