运算符
运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等
- 算术运算符
- 赋值运算符
- 关系运算符[比较运算符]
- 逻辑运算符
- 位运算符[需要二进制基础]
- 三元运算符
算术运算符
算术运算符是对数值类型的变量进行运算的,在Java程序中使用的非常多。
- +, -, *,/,%,++,- -,重点讲解 /、%、++
- 自增:++
- 作为独立的语句使用:
前++和后++都完全等价于i=i+1;
作为表达式使用
前++:++i先自增后赋值
后++: i++先赋值后自增 - –,+、-、*是一个道理,完全可以类推。
System.out.print1n(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.print1n( "i=" + i); //12
/*
作为表达式使用
前++∶++i先自增后赋值后++∶i++先赋值后自增
*/
int j= 8;
int k = ++j;//等价j=j+1;k=j;
system.out.print1n( "k=" + k + "j=" + j);//9 9
int j= 8;
int k = j++;//等价k=j;j=j+1;
system.out.print1n( "k=" + k + "j=" + j);//8 9
//面试题1
int i=1;//i->1
i=i++;//规则使用临时变量:(1) temp=i; (2) i=i+1; (3) i=temp;
System.out.println(i); //1
//面试题2
int i=1;
i=++i;//规则使用临时变量;(1) i=i+1;(2) temp=i;(3)i=temp;
System.out.println(i);//2
int i1 = 10;
int i2 =20;
int i=i1++;//i=10,i1=11
System.out.print("i="+i);10
System.out.println("i2="+i2);20
i = --i2;//i2=19,i=19
System.out.print("i="+i);//19
System.out.println("i2="+i2);//19
- 假如还有59天放假,问:合xx个星期零xx天
int days = 59;
int weeks = days / 7;
int leftDays = days % 7;
System.out.println(days + "天 合" + weeks +"星期零"
+leftDays +"天");
- 定义一个变量保存华氏温度,华氏温度转换摄氏温度的公式为:5/9*(华氏温度-100),请求出华氏温度对应的摄氏温度。[234.5]
double huaShi = 1234.6;
double sheShi = 5.0 / 9 * (huaShi - 100);//考虑数学公式与java语言的特性
System.out.println("华氏温度" + huaShi + "对应的摄氏温度="+ sheShi);
关系运算符(比较运算符)
介绍
- 关系运算符的结果都是boolean型,也就是要么是true,要么是false
- 关系表达式经常用在if结构的条件中或循环结构的条件中
int a = 9;//提示:开发中,不可以使用a, b a1,bc n1 ,n2...
int b = 8;
System.out.println(a>b);
System.out.println(a>=b);
System.out.println(a<=b);
System.out.println(a<b);
System.out.println(a==b);
System.out.println(a!=b);
boolean flag = a>b;
system.out.println( "flag=" + flag);
细节说明
- 关系运算符的结果都是boolean型,也就是要么是true,要么是false.
- 关系运算符组成的表达式,我们称为关系表达式。a > b
- 比较运算符"=="“不能误写成”="
逻辑运算符
分为两组学习
- 短路与&&,短路或 ||,取反!
- 逻辑与&,逻辑或 |,^逻辑异或
说明逻辑运算规则: - 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
&&和&基本规则
名称 | 语法和特点 |
---|---|
短路与&& | 条件1&&条件2 -------------两个条件都为true,结果为true |
逻辑与& | 条件1&条件2----------------两个条件都为true,结果为true |
&&和&使用区别
- &&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
- &逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低
- 开发中,我们使用的基本是短路与&&,效率高
|和||基本规则名称
名称 | 语法和特点 |
---|---|
短路或|| | 条件1||条件2—只要有一个条件成立,结果为true,否则为false。 |
逻辑或| | 条件1|条件2—只要有一个条件成立,结果为true,否则为false |
||和|的使用规则
- ||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高
- |逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
- 开发中,我们基本使用||
!取反基本规则
名称 | 语法和特点 |
---|---|
!非(取反) | !条件——如果条件本身成立,结果为false,否则为true。 |
a^b:叫逻辑异或,当a和b不同时,则结果为true,否则为false
System.out.println((4<1)^(6> 3));//true
练习题1请写出每题的输出结果
int x = 5;
int y=5;
if(x++==6 & ++y==6){//5==6->false,x=6;y=6,6==6->true.FALSE
x= 11;
}
System.out.println("x="+x+",y="+y);//6,6
int x = 5,y = 5;
if(x++==6 && ++y==6){//5==6->false,x=6.FALSE
x= 11;
}
System.out.println("'x="+x+",y="+y);//6,5
int x = 5,y= 5;
if(x++==5 |++y==5){//5==5->true,x=6;y=6,6==5->false.TRUE
x =11;
}
System.out.println("x="+x+",y="+y);//11,6
int x = 5,y = 5;
if(x++==5 || ++y==5){//5==5->true,x=6;TRUE
x=11;
}
System.out.println("x="+x+",y="+y);//11,5
练习题2请写输出结果
boolean x=true;
boolean y=false;
short z=46;
if((z++==46)&&(y=true) )z++;//46==46->true,z=47;y=true=>TRUE.z=48
if((x=false)||(++Z==49)) z++;//x=false;z=49,49==49,true=>TRUE,z=50
System. out.println("z="+z);//z=50
赋值运算符
介绍
赋值运算符就是将某个运算后的值,赋给指定的变量。
- 赋值运算符的分类
基本赋值运算符=
复合赋值运算符
+=, -=,*=,/=,%=等,重点讲解一个+=,其它的使用是一个道理
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++;
byte b = 3;
b+= 2;//等价b = (byte)(b + 2);
b++;// b = (byte)(b+1);
三元运算符
基本语法
条件表达式?表达式1:表达式2;
运算规则:
- 如果条件表达式为true,运算后的结果是表达式1;
- 如果条件表达式为false,运算后的结果是表达式2;
int a= 10;
int b = 99;
//解读
//1. a > b为false
//2.返回b--,先返回b的值,然后在b-1
//3.返回的结果是99
int result = a>b? a++ :b--;
使用细节
1.表达式1和表达式2要为可以赋给接受变量的类型
(或可以自动转换/强制转换)
int a = 3;
int b = 8;
int c = a>b? (int)1.1 : (int)3.4;
double d = a > b ? a : b + 3;//可以的,满足int->double
2.三元运算符可以转成if–else语句
int res = a > b ? a++ : --b;
if (a > b) res = a++;
else res = --b;
//案例:实现三个数的最大值
int n1 = 553;
int n2 = 33;
int n3 = 123;
//思路
//1.先得到n1和n2中最大数,保存到max1
//2.然后再求出max1和n3中的最大数,保存到max2
int max1 = n1 > n2 ? n1 : n2;
int max2 = max1 > n3 ? max1 : n3;
System.out.print1n("最大数=" + max2);
运算符优先级
- 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如下表,上一行运算符总优先于下一行。
- 只有单目运算符、赋值运算符是从右向左运算的。
标识符的命名规则和规范
标识符概念
- Java对各种变量、方法和类等命名时使用的字符序列称为标识符
- 凡是自己可以起名字的地方都叫标识符int num1 = 90;
标识符的命名规则(必须遵守)
- 由26个英文字母大小写,0-9,_或$组成
- 数字不可以开头。int 3ab =1;//错误
- 不可以使用关键字和保留字,但能包含关键字和保留字。
- Java中严格区分大小写,长度无限制。int totalNum = 10; int n = 90;
- 标识符不能包含空格。int a b = 90;
判断下面变量名是否正确
hsp//t
hsp12//t
1hsp//f
h-s//f
x h//f
h$4//t
class//f
int//f
double//f
public//f
static//f
goto//f,是保留字
stu_name//t
标识符命名规范
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc
比如com.hsp.crm - 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰]
比如:TankShotGame - 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz[小驼峰,简称驼峰法]
比如: tankShotGame - 常量名:所有字母都大写。多单词时每个单词用下划线连接: XXx_YY_zzz
比如:定义一个所得税率TAX RATE - 后面我们学习到类,包,接口,等时,我们的命名规范要这样遵守,更加详细的看文档.
关键字
关键字的定义和特点(不用背)
定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:关键字中所有字母都为小写
保留字
介绍
Java保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字
byValue、cast、future、generic、inner、operator、outer、rest、var、goto 、const
键盘输入语句
介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。Input.java,需要一个扫描器(对象),就是 Scanner
步骤:
- 导入该类的所在包,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创建一个对象,体会
//myScanner就是Scanner类的对象
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.print1n("人的信息如下:");
System.out.println("名字=" + name
+"年龄=" + age + "薪水=" + sal);
进制
进制介绍
对于整数,有四种表示方式:
- 二进制: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;
进制的转换(基本功)
进制转换的介绍
第一组:
1.二进制转十进制
2.八进制转十进制
3.十六进制转十进制
第二组:
1.十进制转二进制
2.十进制转八进制
3.十进制转十六进制
第三组
1.二进制转八进制
2.二进制转十六进制
第四组
1.八进制转二进制
2.十六进制转二进制
二进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和。
案例:请将0b1011转成十进制的数
0b1011=1 * 2的(1-1)次方+1* 2的(2-1)次方+0*2的(3-1)次方+1*2的(4-1)次方=1 + 2 + 0 + 8 = 11
八进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和。
案例:请将0234转成十进制的数
0234 =4 * 8 ^ 0 + 3 * 8 ^ 1 + 2 * 8 ^ 2 = 4 + 24 + 128 = 156
十六进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
案例:请将Ox23A转成十进制的数
0x23A = 10 * 16 ^ 0 + 3 * 16 ^1 + 2 * 16 ^ 2 =10+ 48 + 512 = 570
十进制转换成二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:请将34转成二进制 =
十进制转换成八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。
案例:请将131转成八进制=>0203
十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:请将237转成十六进制=>0xED
二进制转换成八进制、十六进制
-
二进制转换成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可.案例:请将ob11010101转成八进制
ob11(3)010(2)101(5) =>0325 -
二进制转换成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。案例:请将ob11010101转成十六进制
ob1101(D)0101(5)= 0xD5 -
八进制转换成二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。案例:请将0237转成二进制
02(010)3(011)7(111)= 0b010011111 -
十六进制转换成二进制
规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。案例:请将0x23B转成二进制
0x2(0010)3(0011)B(1011)=0b001000111011
位运算的思考题
1)请看下面的代码段,回答a,b,c,d,e结果是多少?
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=?//2按位或3
~-5=?//按位取反
13&7=?//13按位与7
5|4=?//5按位或4
-3^3=?//^按位异或
二进制在运算中的说明
1.二进制是逢2进位的进位制,0、1是基本算符。
⒉现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary)) 数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
原码、反码、补码(重点难点)
网上对原码,反码,补码的解释过于复杂,我这里精简几句话:
对于有符号的而言:
1.二进制的最高位是符号位:0表示正数,1表示负数(口诀:0->01->-)
2.正数的原码,反码,补码都一样(三码合一)
3.负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
4.负数的补码=它的反码+1,负数的反码=负数的补码-1
5.0的反码,补码都是0
6. java没有无符号数,换言之, java中的数都是有符号的
7. 在计算机运算的时候,都是以补码的方式来运算的.
8. 当我们看运算结果的时候,要看他的原码
位运算符
java中有7个位运算(&、|、^、~、>>、<<和>>>)
分别是按位与&、按位或|、按位异或^,按位取反~,它们的运算规则是:
按位与&:两位全为1,结果为1,否则为0
按位或|: 两位有一个为1,结果为1,否则为0
按位异或^: 两位一个为0,一个为1,结果为1,否则为0
按位取反~ : 0->1,1->0
比如:2&3=?
//看老师的推导过程
//1.先得到2的补码=〉2的原码00000000 00000000 00000000 00000010
// 2的补码00000000 00000000 00000000 00000010
//2.3的补码 3的原码00000000 00000000 00000000 00000011
// 3的补码00000000 00000000 00000000 00000011
//3.按位&
// 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000010 &运算后的补码
// 运算后的原码也是00000000 00000000 00000000 00000010
// 结果就是2
System.out.println(2&3);//2
~ -2=?
//推导
//1.先得到 -2的原码 10000000 00000000 00000000 00000010
//2. -2的反码 11111111 11111111 11111111 11111101
// 3.-2的补码 11111111 11111111 11111111 11111110
//4.~-2操作 00000000 00000000 00000000 00000001运算后的补码
//5.运算后的原码就是00000000 00000080 00000000 00000001 =>1
System.out.println(~-2i);//1
~2=?
//推导
//1.得到2的补码 00000800 00000000 00000000 00000010
//2.~2操作 11111111 11111111 11111111 11111101 运算后的补码
//3.运算后的反码 11111111 11111111 11111111 11111100
//4.运算后的原码 10000000 00000000 00000000 00000011=>-3
System.out.println(~2);//-3
2|3=?
//推导
//1.得到2的原码 00000800 00000000 00000000 00000010
// 得到2的补码 00000800 00000000 00000000 00000010
//2.得到3的原码 00000800 00000000 00000000 00000011
// 得到3的补码 00000800 00000000 00000000 00000011
//3. | 操作 00000800 00000000 00000000 00000011 运算后的补码
//4.运算后的原码 00000800 00000000 00000000 00000011=>3
2^3=?
//1.得到2的原码 00000800 00000000 00000000 00000010
// 得到2的补码 00000800 00000000 00000000 00000010
//2.得到3的原码 00000800 00000000 00000000 00000011
// 得到3的补码 00000800 00000000 00000000 00000011
//3. ^ 操作 00000800 00000000 00000000 00000011 运算后的补码
//4.运算后的原码 00000800 00000000 00000000 00000001=>1
位运算符
还有3个位运算符>>、<<和>>>,运算规则;
- 算术右移>>∶低位溢出,符号位不变,并用符号位补溢出的高位
- 算术左移<<:符号位不变,低位补0
- >>>逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
- 特别说明:没有<<<符号
- 应用案例 BitOperator02.java
int a=1>>2;//1 => 00000001 => 00000000本质1/2/2 =0
int c=1<<2;//1 => 00000001 => 00000100本质1*2*2=4
System.out.println(4 << 3);// 4*2*2*2 = 32
System.out. println(15 >>2);// 15 / 2/ 2 = 3
完成前面的案例
建议:掌握老师讲解的即可,不用再深入.
本章作业
1.计算下列表达式的结果
10/3 = ? ; 10/5 = ? ;10%2 =? ;-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.试说出下面代码的结果
int i=66;
System.out.println(++i+i);
System.out.println(++i+i);//执行i=i+1=>i= 67 =>134
3.在Java中,以下赋值语句正确的是(CD)。
A) int num1=(int)“18”;//'错误应该Integer.parseInt(“18”);
B) int num2=18.0;//F
C) double num3=3d;//T
D) double num4=8;//T
E) int i=48; char ch = i+1;//错误int ->char
F) byte b = 19; short s = b+2;//错误int ->short
4.试写出将String转换成double类型的语句,以及将char类型转换成String的语句,举例说明即可,写简单代码
String str = "18.8";
//注意字符串要可以被转成double
double d1 = Double.parseDouble(str);
char c1 ='韩;
String str2 = c1 +"";