运算符与表达式
1. 运算符介绍
运算符是一种特殊的符号,用以表示数据的运算、赋值和比较等。
1) 算术运算符 2) 赋值运算符 3) 关系运算符 [比较运算符]
4) 逻辑运算符 5) 位运算符 [需要二进制基础] 6) 三元运算符
1.1 算术运算符
介绍:算术运算符是对数值类型的变量进行运算的
,在Java程序中使用的非常多。
案例:
System.out.println(10/4);//从数学来看是2.5,java中2
System.out.println(10.0/4);//java是2.5
doubled=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 细节说明:
1. 对于除号 "/",它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。例如:int x= 10/3 ,结果是3
2. 当对一个数取模时,可以等价 a%b=a-a/b*b,这样我们可以看到取模的一个本质运算。
3. 当自增当做一个独立语言使用时,不管是++i;还是 i++;都是一样的,等价。
1.3 面试题案例:
// int i = 1; //i->1
// i = i++; //规则使用临时变量:(1)temp=i;(2) i=i+1;(3)i=temp;
// System.out.println(i); // 1
// 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++;
System.out.print("i="+i);//10
System.out.println("i2="+i2);//20
i =--i2;
System.out.print("i="+i);//19
System.out.println("i2="+i2);//19
2. 关系运算符(比较运算符)
2.1 介绍
1) 关系运算符的结果都是boolean型,也就是要么是true,要么是false
2) 关系表达式经常用在 if 结构的条件中或循环结构的条件中
案例演示:
inta=9; //提示:开发中,不可以使用a,b
intb=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);
2.2 细节说明
1) 关系运算符的结果都是boolean型,也就是要么是true,要么是false。
2) 关系运算符组成的表达式,我们称为关系表达式。 a>b
3) 比较运算符"=="不能误写成"="
3. 逻辑运算符
3.1 介绍
用于连接多个条件(多个关系表达式),最终的结果也是一个boolean值。
3.2 逻辑运算符一览
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
3.3 &&和&基本规则
名称 语法 特点
短路与&& 条件1&&条件2 两个条件都为true,结果为true,否则false
逻辑与& 条件1&条件2 两个条件都为true,结果为true,否则false
案例:
//&&短路与和&案例演示
intage=50;
if(age>20&&age<90){
System.out.println("ok100");
}
//&逻辑与使用
if(age > 20 & age < 90) {
System.out.println("ok200");
}
//区别
int a = 4;
int b = 9;
//对于&&短路与而言,如果第一个条件为false,后面的条件不再判断
//对于&逻辑与而言,如果第一个条件为false,后面的条件仍然会判断
if(a < 1 & ++b < 50) {
System.out.println("ok300");
}
System.out.println("a=" + a + " b=" + b);// 4 10
3.4 && 和 & 使用区别
1) &&短路与:如果第一个条件为false,则第二个条件不会判断,最终结果为false,效率高
2) & 逻辑与:不管第一个条件是否为false,第二个条件都要判断,效率低
3) 开发中,我们使用的基本是使用短路与&&,效率高
3.5 ||和|基本规则
名称 语法 特点
短路或|| 条件1||条件2 两个条件中只要有一个成立,结果为true,否则为false
|逻辑或 条件1 | 条件2 只要有一个条件成立,结果为true,否则为false
案例演示:
//||短路或和|逻辑或案例演示
//||规则:两个条件中只要有一个成立,结果为true,否则为false
//|规则:两个条件中只要有一个成立,结果为true,否则为false
intage=50;
if(age>20||age<30){
System.out.println("ok100");
}
//&逻辑与使用
if(age>20|age<30){
System.out.println("ok200");
}
//看看区别
//(1)||短路或:如果第一个条件为true,
//则第二个条件不会判断,最终结果为true,效率高
//(2)|逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
inta=4;
intb=9;
if(a>1||++b>4){//可以换成|测试
System.out.println("ok300");
}
System.out.println("a="+a+"b="+b);//410
3.6 || 和 | 使用区别
1) ||短路或:如果第一个条件为true,则第二个条件不会判断,最终结果为true,效率高
2) |逻辑或:不管第一个条件是否为true,第二个条件都要判断,效率低
3) 开发中,我们基本使用 ||
3.7 !取反基本规则
名称 语法 特点
!非(取反) !条件 如果条件本身成立,结果为false,否则为true
案例演示:
//!操作是取反T->F ,F->T
System.out.println(60>20);//T
System.out.println(!(60>20));//F
//a^b:叫逻辑异或,当a和b不同时,则结果为true,否则为false
booleanb=(10>1)^(3>5);
System.out.println("b="+b);//T
3.8 ^案例演示
a^b: 叫逻辑异或,当a和b不同时,则结果为true,否则为false
4. 赋值运算符
4.1 介绍
基本赋值运算符 = inta=10;
复合赋值运算符:
+= ,-= ,*= , /= ,%= 等 , 重点讲解一个 += ,其它的使用是一个道理
a += b; [等价 a=a+b;] a-= b; [等价 a=a-b;]
4.2 赋值运算符特点
1) 运算顺序从右往左 int num= a+b+c;
2) 赋值运算符的左边 只能是变量,右边 可以是变量、表达式、常量值
int num = 20; int num2= 78 * 34- 10; int num3 = a;
3) 复合赋值运算符等价于下面的效果 比如:a+=3;等价于a=a+3; 其他类推
4) 复合赋值运算符会进行类型转换。 byte b = 2; b+=3; b++;
intn1=10;
n1+=4;//n1=n1+4;
System.out.println(n1);//14
n1/=3;//n1=n1/3;//4
System.out.println(n1);//4
//复合赋值运算符会进行类型转换
byteb=3;
b+=2;//等价b=(byte)(b+2);
b++;//b=(byte)(b+1);
5. 三元运算符
5.1 基本语法
条件表达式 ? 表达式 1: 表达式2;
运算规则:
1. 如果条件表达式为true,运算后的结果是表达式1;
2. 如果条件表达式为false,运算后的结果是表达式2;
案例:
inta=10;
intb=99;
//解读
//1.a>b为false
//2.返回b--,先返回b的值,然后在b-1
//3.返回的结果是99
intresult=a>b?a++:b--;
System.out.println("result="+result);
System.out.println("a="+a);
System.out.println("b="+b);
5.2 使用细节
1) 表达式1和表达式2要为可以赋给接收变量的类型(或可以自动转换)
2) 三元运算符可以转成if--else语句
//表达式1和表达式2要为可以赋给接收变量的类型
//(或可以自动转换/或者强制转换)
int a=3;
int b=8;
int c=a>b?(int)1.1:(int)3.4;//可以的
doubled=a>b?a:b+3;//可以的,满足int->double
6. 运算符优先级
1) 运算符有不同的优先级,所谓优先级就是表达式运算中的运算顺序。如右表,上一行运算符总优先于下一行。
2) 只有单目运算符、赋值运算符是从右向左运算的。
7. 标识符的命名规则和规范
标识符的命名规则(必须遵守)
1. 由26个英文字母大小写,0-9,或$组成
2. 数字不可以开头。int 3ab = 1; //错误
3. 不可以使用关键字和保留字,但能包含关键字和保留字。
4. Java中严格区分大小写,长度无限制。int totalNum = 10; int n = 90;
5. 标识符不能包含空格。int a b = 90;
7.1 标识符命名规范[更加专业]
1) 包名:多单词组成时所有字母都小写:aaa.bbb.ccc//比如 com.zak.crm
2) 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz[大驼峰] 比如: TankShotGame
3) 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始每个单词首字母大写:xxxYyyZzz [小 驼峰, 简称 驼峰法] 比如: tankShotGame
4) 常量名:所有字母都大写。多单词时每个单词用下划线连接:XXX_YYY_ZZZ 比如 :定义一个所得税率 TAX_RATE
5) 后面我们学习到 类,包,接口,等时,我们的命名规范要这样遵守,更加详细的看文档.
8. 关键字
定义:被Java语言赋予了特殊含义,用做专门用途的字符串(单词)
特点:关键字中所有字母都为小
9. 保留字
9.1 介绍
Java 保留字:现有Java版本尚未使用,但以后版本可能会作为关键字使用。自己命名标识符时要避免使用这些保留字byValue、cast、future、 generic、 inner、 operator、 outer、 rest、 var 、 goto 、const
10. 键盘输入语句
10.1 介绍
在编程中,需要接收用户输入的数据,就可以使用键盘输入语句来获取。Input.java, 需要一个 扫描器(对象), 就是Scanner
10.2 步骤 :
1) 导入该类的所在包, java.util.*
2) 创建该类对象(声明变量)
3) 调用里面的功能
案例:
要求:可以从控制台接收用户信息,【姓名,年龄,薪水】
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.println("人的信息如下:");
System.out.println("名字="+name
+"年龄="+age+"薪水="+sal);
}}
11. 进制(程序员的基本功)
11.1 进制介绍
对于整数,有四种表示方式:
二进制: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不区分大小写。
举例:
//n1二进制
intn1=0b1010;
//n210进制
intn2=1010;
//n38进制
int n3 = 01010;
//n4 16 进制
int n4 = 0X10101;
System.out.println("n1=" + n1);
System.out.println("n2=" + n2);
System.out.println("n3=" + n3);
System.out.println("n4=" + n4);
System.out.println(0x23A);
11.2 二进制转换成十进制示例
11.3 八进制转换成十进制示例
11.4 十六进制转换成十进制示例
规则:从最低位(右边)开始,将每个位上的数提取出来,乘以16的(位数-1)次方,然后求和。
案例:请将 0x23A 转成十进制的数 0x23A= 10 * 16^0 + 3 *16^1+2*16^2=10+48+512=570
11.5 十进制转换成二进制
规则:将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制。
案例:请将 34 转成二进制 =0B 00100010
11.6 十进制转换成八进制
规则:将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制。 案例:请将 131 转成八进制 =>0203
11.7 十进制转换成十六进制
规则:将该数不断除以16,直到商为0为止,然后将每步得到的余数倒过来,就是对应的十六进制。
案例:请将 237 转成十六进制 =>0xED
11.8 二进制转换成八进制
规则:从低位开始,将二进制数每三位一组,转成对应的八进制数即可。
案例:请将 ob11010101 转成八进制 ob11(3)010(2)101(5) => 0325
11.9 二进制转换成十六进制
规则:从低位开始,将二进制数每四位一组,转成对应的十六进制数即可。
案例:请将 ob11010101 转成十六进制 ob1101(D)0101(5) = 0xD5
11.10 八进制转换成二进制
规则:将八进制数每1位,转成对应的一个3位的二进制数即可。
案例:请将 0237 转成二进制 02(010)3(011)7(111) = 0b10011111
11.11 十六进制转换成二进制
规则:将十六进制数每1位,转成对应的4位的一个二进制数即可。
案例:请将 0x23B 转成二进制 0x2(0010)3(0011)B(1011) = 0b001000111011
12. 位运算的思考题
// 1) 请看下面的代码段,回答a,b,c,d,e结果是多少?
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=?
~-5=?
13&7=?
5|4=?-3^3=?//^ 按位异或
13. 二进制在运算中的说明
1. 二进制是逢2进位的进位制,0、1是基本算符。
2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制(Binary) 数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,这个值以二倍递增。
14. 原码、反码、补码(重点 难点)
1. 二进制的最高位是符号位:0表示正数,1表示负数
2. 正数的原码,反码,补码都一样(三码合一)
3. 负数的反码 = 它的原码符号位不变,其它位取反(0->1,1->0)
4. 负数的补码 = 它的反码+1,负数的反码 = 负数的补码 -1
5. 0的反码,补码都是0
6. java没有无符号数,换言之,java中的数都是有符号的
7. 在计算机运算的时候,都是以补码的方式来运算的
8. 当我们看运算结果的时候,要看他的原码(重点)
15. 位运算符
java 中有 7 个位运算( &、|、^、~、>>、>> )
还有3个位运算符 >>、>>, 运算规则:
1) 算术右移 >>:低位溢出,符号位不变,并用符号位补溢出的高位
2) 算术左移 <<: 符号位不变,低位补0
3) >>> 逻辑右移也叫无符号右移,运算规则是: 低位溢出,高位补 0
4) 特别说明:没有 <<< 符号
应用案例:
1) int a=1>>2; //1 => 00000001 => 00000000 本质 1 / 2 /2 =0
2) int c=1<<2; //1 => 00000001 => 00000100 本质 1 * 2 * 2 = 4