韩顺平 零基础30天学会Java第四章

运算符

运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等

  • 算术运算符
  • 赋值运算符
  • 关系运算符[比较运算符]
  • 逻辑运算符
  • 位运算符[需要二进制基础]
  • 三元运算符

算术运算符

算术运算符是对数值类型的变量进行运算的,在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个位运算符>>、<<和>>>,运算规则;

  1. 算术右移>>∶低位溢出,符号位不变,并用符号位补溢出的高位
  2. 算术左移<<:符号位不变,低位补0
  3. >>>逻辑右移也叫无符号右移,运算规则是:低位溢出,高位补0
  4. 特别说明:没有<<<符号
  • 应用案例 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 +"";
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值