JAVA学习——运算符
文章目录
一、运算符
1.介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
2.运算符分类
- 算术运算符
- 赋值运算符
- 关系运算符【比较运算符】
- 逻辑运算符
- 位运算符【需要二进制基础】
- 三元运算符
二、算术运算符
1.介绍
算术运算符是对数值类型的变量进行运算的,在Java程序中使用的非常多。
2.算术运算符一览
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正号 | +7 | 7 |
- | 负号 | b=11;-b | -11 |
+ | 加 | 9+9 | 18 |
- | 减 | 10-8 | 2 |
* | 乘 | 7*8 | 56 |
/ | 除 | 9/9 | 1 |
% | 取模(取余) | 11%9 | 2 |
++ | 自增(前):先运算后取值 | a=2;b=++a | a=3;b=3 |
++ | 自增(后):先取值后运算 | a=2;b=a++ | a=3;b=2 |
– | 自减(前):先运算后取值 | a=2;b=–a | a=1;b=1 |
– | 自减(后):先取值后运算 | a=2;b=a– | a=1;b=2 |
+ | 字符串相加 | “hsp”+“edu” | "hsp edu |
3.算术运算符使用
① 除法(/)
System.out.println(10 / 4);
//输出2,因为10和4都是int型数据,结果为int型
System.out.println(10.0 / 4);
//输出2.5,因为10.0是double型,故结果为double型
double d = 10 / 4;
System.out.println(d);
//输出2.0,因为10/4计算得int型结果2,然后将2转换为double型得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.5 % 3 = -10.5 - (int)(-10.5) / 3 * 3 = -10.5 - (-10) / 3 * 3 = -1.5
③ 自增(++)用法同自减(- -)
当独立使用自增符号是,i++和++i是一样的,都等价于i = i + 1
在表达式中使用时: 前++:先自增后赋值 后++:先赋值后自增
/*在表达式中使用时:
前++:先自增后赋值
后++:先赋值后自增
*/
int j = 8;
int k = j++; // k = j;j = j + 1
System.out.println("k = " + k + "j = " + j) // 结果:k = 8; j = 9
int x = 8;
int y = ++x; // x = x + 1;y = x;
System.out.println("y = " + y + "x = " + x) // 结果:x = 9; y = 9
4.练习题
//内存分析法
int i = 1;
i = i++;//使用临时变量:(1) temp = i;(2)i = i + 1;(3)i = temp;
System.out.println(i);//输出1
int x = 1;
x = ++x;//仍使用临时变量:(1)x = x + 1;(2)temp = x;(3)x = temp;
System.out.println(x);//输出2
//定义一个变量保存华氏温度,华氏温度转换为摄氏温度的公式为:5/9*(华氏温度-100)
//算出华氏温度对应的摄氏温度
double a = 234.5;
double b = 5.0 / 9 * (a - 100);
//注意是5.0不是5,因为int型的精度比较低,导致5/9最后的结果为0
System.out.println("对应的摄氏温度为" + b);
三、关系运算符(比较运算符)
1.介绍
关系运算符的结果都是布尔型,也就是结果要么为true,有么是false。
关系运算符经常用在if结构的条件中或循环结构的条件中。
2.关系运算符一览
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
== | 相等于 | 8==7 | false |
!= | 不等于 | 8!=7 | true |
< | 小于 | 8<7 | false |
> | 大于 | 8>7 | true |
<= | 小于等于 | 8<=8 | false |
>= | 大于等于 | 8>=7 | true |
instanceof | 检查是否是类的对象 | “hsp” instanceof String | true |
3.关系运算符使用
① 关系运算符的结果都是boolean型,true 或者 false。
② 关系运算符组成的表达式叫做关系表达式。
③ 比较运算符“= =”不能误写成“=”。
四、逻辑运算符
1.介绍
用于连接多个条件(多个关系表达式),最终的结果也是一个布尔值。
2.逻辑运算符一览
1)短路与 &&,短路或 ||,取反!
2)逻辑与 &,逻辑或 |,逻辑异或 ^
a | b | a&b(逻辑与) | a&&b(短路与) | a|b(逻辑或) | a||b(短路或) | !a(取反) | a^b(逻辑异或) |
---|---|---|---|---|---|---|---|
true | true | true | true | true | true | false | false |
true | false | false | false | true | true | false | true |
false | true | false | false | true | true | true | true |
false | false | false | false | false | false | true | false |
3.运算规则
①a&b:& 叫逻辑与:规则:当a 和 b 同时为true,则结果为true,否则为false
②a&&b:&& 叫短路与:规则:当a 和b 同时为true ,则结果为true,否则为false
③alb:| 叫逻辑或,规则:当a 和b,有一个为true,则结果为true,否则为false
④al|b:|| 叫短路或,规则:当a 和b,有一个为true,则结果为true,否则为false
⑤!a:叫取反,或者非运算。当a 为true,则结果为false,当a为false是,结果为true
⑥a^b: 叫逻辑异或,当a和 b不同时,则结果为true, 否则为false
4.使用细节
① && 和 & 使用区别
&&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false。
&逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低。
在开发当中,一般都是用短路与&&,效率高。
② | | 和 | 使用区别
| | 短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高。
| 逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低。
在开发当中,一般都是用短路或| |,效率高。
五、赋值运算符
1.介绍
基本赋值运算符: =
复合赋值运算符:+ = ;- =;* =;/ =;%=
2.细节特点
(1)运算顺序从右往左。
(2)赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值。
(3)复合赋值运算符等价于下面的效果:a += 3==>a = a + 3。
(4)复合赋值运算符会进行类型转换。
byte b = 3;
b += 2; //等价于b = (byte)(b + 2);
b++; //等价于b = (byte)(b + 1);
六、三元运算符
1.基本语法
条件表达式 ? 表达式1:表达式2;
运算规则:
(1)如果条件表达式为true,运算后的结果是表达式1;
(2)如果条件表达式为false,运算后的结果是表达式2。
2.使用细节
(1)表达式1和表达式2要为可以赋给接受变量的类型(或者可以自动转换);
(2)三元运算符可以转为if–else语句。
if res = a > b ? a++;--b; //等价于下面
if (a > b)
res = a++;
else
res = --b;
练习题:求三个数中的最大值
int a = 10;
int b = 20;
int c = 30;
//方法一
int temp = a > b ? a : b;
int lagest = temp > c ? temp : c;
System.out.println("a,b,c当中最数的是" + lagest);
//方法二,方法二会执行三次三元运算,故实际应用中更倾向于使用方法一
int lagest = (a > b ? a : b) > c ? (a > b ? a : b) : c;
System.out.println("a,b,c当中最数的是" + lagest);
七、运算符优先级
1.规则表(优先级从高到低)
2.梳理
1)只有单目运算符(第二行)和赋值运算符(最后一行)是从右向左运算的。
2)优先级从上到下依次减退。
①() {}等
②单目运行 + + - -
③算术运算符
④位移运算符
⑤比较运算符
⑥逻辑运算符
⑦三元运算符
⑧赋值运算符
八、标识符的命名规则和规范
1.标识符概念
(1)Java对各种变量、方法和类等命名时使用的字符序列称为标识符。
(2)凡是可以自己起名字的地方都叫标识符 int num1 = 90。
2.标识符的命名规则(规则是必须遵守)
(1)由26个英文字母大小写,0-9,_或$组成。
(2)数字不可以开头。
(3)不可以使用关键字和保留字,但是可以包含关键字和保留字。
(4)Java中严格区分大小写,长度无限制。
(5)标识符不能包含空格。
int a b = 35;//错误的命名方法,编译时会报错
3.标识符命名规范(规范是指这样做更专业)
(1)包名:多单词组成时所有字母都小写:aaa.bbb.ccc
比如com.hsp.crm
(2)类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰]
比如:TankShotGame
(3)变量名、方法名:多单词组成是,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰,简称 驼峰法]
比如:tankShotGame
(4)常量名:所有字母都大写。多单词时,每个单词都用下划线链接:XXX_YYY_ZZZ
比如:TAX_RATE
(5)其他的规范之后补充。
4.Java中的关键字
(1)定义:被Java语言赋予了特殊意义,(2)用作专门用途的字符串(单词)。
特点:关键字中所有字母都为小写。
5.Java中的保留字
(1)介绍:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字。
(2)byValue、cast、future、generic、operator、outer、inner、rest、var、goto、const
九、键盘输入语句
1.介绍
在编程中,需要接受用户输入的数据,就可以使用键盘输入语句来获取。
Input.java ,需要一个扫描器(对象),就是Scanner。
2.步骤
(1)导入该类的所在包,java.util.* (*在此为Scanner)。
(2)创建该类对象(声明变量)。
(3)调用里面的功能。
/*案例演示:
要求:可以从控制台接收用户信息【姓名、年龄、薪水】
*/
//第一步:首先引入Scanner所在的包,Scanner类是一个简单的文本扫描器
import java.util.Scanner;//表示把java.util这个包下的Scanner类导入
public class Input {
public static void main(String[] args){
//第二步:创建Scanner对象,oneScanner是Scanner类的一个对象
Scanner oneScanner = new Scanner(System.in);
//第三步:使用相关的方法接受用户的输入
System.out.println("请输入姓名:");
String name = oneScanner.next();//.next()就是接收用户输入字符串的方法
//当执行到next方法时,会等待用户输入
System.out.println("请输入性别:");
String gender = oneScanner.next();
System.out.println("请输入年龄:");
int age = oneScanner.nextInt();//.nextInt()是接受一个int类型数据的方法
System.out.println("请输入薪资:");
double sal = oneScanner.nextDouble();//.nextDouble()是接受一个Double类型数据的方法
System.out.println("姓名:" + name + " 性别:" + gender
+" 年龄:"+ age + " 薪资:" + sal);
}
}
十、进制
1.介绍
对于整数,有四种表示方式:
1) 二进制BIN:0,1,满2进1,以0b或0B开头。(数字0加b或B)
2) 十进制DEC:0-9,满10进1。
3) 八进制OCT:0-7,满8进1,以数字0开头表示。
4) 十六进制HEX:0-9及A(10)-F(15),满16进1,以0x或者0X开头表示,其中A-F不区分大小写。(数字0加x或X)
//举例说明:演示四种机制
int n1 = 0b1010;//二进制10
int n2 = 1010;//十进制1010
int n3 = 01010;//八进制520
int n4 = 0x1010;//十六进制65793
2.十进制转二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:将34转成二进制 = 0b0010010
3.十进制转八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
案例:将131转成八进制 = 0203
4.十进制转十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:将237转成十六进制 = 0XED
5.二进制转换成八进制
规则:从低位开始,将二进制每三位一组,转成相应的八进制数即可。
案例:将0b11010101
6.二进制转换成十六进制
规则:从低位开始,将二进制每四位一组,转成相应的十六进制数即可。
案例:将0b11010101
7.八进制转二进制
规则:将八进制每一位数,转成对应的一个三位的二进制数即可。
案例:将0237转成二进制
8.十六进制转二进制
规则:将十六进制每一位数,转成对应的一个四位的二进制数即可。
案例:将0x23B转成二进制
9.二进制、八进制、十六进制转十进制
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2(或8或16)的(位数-1)次方,然后求和。
十一、原码、反码、补码(重难点)
- 二进制的最高位是符号位:0表示正数,1表示负数。
- 正数的原码、反码,补码都一样(三码合一)。
- 负数的反码 = 它的原码符号位不变,其它位取反。
- 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1。(补码等于反码加一,反码等于补码减一)
- 0的反码,补码都是0。
- java没有无符号数,换言之,java中的数都是有符号的。
- 在计算机运算的时候,都是以补码的方式来运算的。
- 当我们看运算结果时候,要看它的原码,而不是补码。(补码用来运算,但是结果是以原码展示的)
注:补码让正数负数统一了
十二、位运算符
java当中有7个位运算(&、|、^、~、>>、<<和>>>)
运算规则:
-
按位与&:两位全是1,结果为1,否则为0
-
按位或|:两位有一个是1,结果为1,否则为0
-
按位异或^:两位一个是1,一个是0,结果为1,否则为0(两个数要不一样才为1)
-
按位取反~:0变1,1变0
//计算2&3
//1. 先得到2的补码 => 2的原码00000000 00000000 00000000 00000010
// 2的补码(正数的三码合一) 00000000 00000000 00000000 00000010
//2. 得到3的原码和补码 00000000 00000000 00000000 00000011
//3. 按位与&(两位都为1时为1)
// 00000000 00000000 00000000 00000010
//4. 运算后的原码也是00000000 00000000 00000000 00000010(正数三码合一)
//5. 转换为二进制=>2
System.out.println(2&3);
//计算~-2
//1. 先得到-2的补码 => -2的原码10000000 00000000 00000000 00000010
// -2的反码(符号位不变,其余取反) 11111111 11111111 11111111 11111101
//2. 得到-2的补码(在反码的基础上加1)11111111 11111111 11111111 11111110
//3. 按位取反(0变1 1变0)
// 00000000 00000000 00000000 00000001(这是运算后的补码)
//4. 运算后的原码也是00000000 00000000 00000000 00000001(正数三码合一)
//5. 转换为二进制=>1
System.out.println(~-2);
-
算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位(也就是说符号位如果为0就在左边位补0,如果符号位为1就在左边位补1)
-
算术左移<<:符号位不变,低位补0
-
逻辑右移(无符号右移)>>>:低位溢出,高位补0(注意:没有<<<符号)
int a = 1 >> 2;
//000000000 000000000 00000000 000000001
//最后两位01向右溢出,00000000 00000000 00000000 00000000
//本质是1/2/2=0
int c = 1 << 2;
//本质是1*2*2,结果为4