运算符
算术运算符
- +、-、*、/、%、++、–
- %的本质:a % b = a - a / b * b
- 当a为小数时:a % b = a - (int)a/b * b
- -10.5 % 3 = -1.5,有小数运算,得到的结果是近似值
- 独立使用,i++和++i是一样的
- 作为表达式使用:++i先自增后赋值,i++先赋值后自增
//例题一
int i = 1;
i = i++; //规则使用临时变量:(1)temp=i(右边);(2)i=i+1(右边);(3)i=temp(左边);
System.out.println(i); //i=1
//例题二
int i = 1;
i = ++i; //(1)i=i+1;(2)temp=i;(3)i=temp;
System.out.println(i); //i=2
关系运算符
- ==、!=、<、>、instanceof
- 关系运算符的结果都是boolean型,要么是true,要么是false
- 关系运算符组成的表达式,称为关系表达式
- 比较运算符“==”不能误写成“=”
逻辑运算符
- 短路与&&、逻辑与&
- 相同点:两个条件都为true,结果为true
- 不同点:
- 短路与&&:如果第一个条件为false,则第二个条件不会判断,效率高
- 逻辑与&:不管第一个条件是否为false,第二个条件都要判断,效率低
- 短路或||、逻辑或|
- 相同点:两个条件中只要有一个成立,结果为true,否则为false
- 不同点:
- 短路或||:如果第一个条件为true,则第二个条件不判断,效率高
- 逻辑或|:不管第一个条件是否为true,第二个条件都要判断,效率低
- 逻辑非!、逻辑异或
- !操作是取反操作
- a^b:逻辑异或,当a和b不同时,结果为true,否则为假
//练习题,注意算术运算符和关系运算符的区别
boolean x = true;
boolean y = false;
short z = 46;
if((z++ == 46)&&(y = true)) z++;
if((x = false)||(++z == 49)) z++;
System.out.println("z=" + z); //z=50
赋值运算符
- = ,+= ,-= ,*= ,/= ,%=
- a += b;[等价于 a=a+b]
- 运算顺序从右向左
- 赋值运算符左边只能是变量,右边可以是变量、表达式、常量值
- 复合赋值运算符会进行类型转换
byte b = 3;
b += 2; //等价 b = (byte)(b + 2);改成b=b+2将编译不通过
b ++; //b = (byte)(b + 1);
三元运算符
- 语法:条件表达式?表达式1:表达式2;
- 如果为true,就返回表达式1结果;如果为false,返回表达式2结果
- 表达式1和表达式2要为可以赋给接收变量的类型,或可以自动转换(强制转换)
- 三元运算符可以转成if–else语句
运算符优先级
- (),{}等
- 单目运算符 ++,–(从右向左运算)
- 算术运算符
- 位移运算符>>,<<
- 比较运算符
- 逻辑运算符
- 三元运算符
- 赋值运算符(从右向左运算)
标识符规则和规范
- 由26个英文字母大小写,0-9,下划线_或$组成
- 数字不可以开头
- 不可以使用关键字和保留字,但可以包含关键字和保留字
- 严格区分大小写,长度没有限制
- 标识符不能包含空格
- 规范:
- 包名:多单词组成时所有字母小写
- 类名、接口名:多单词组成时,所有单词首字母大写(大驼峰)
- 变量名、方法名:多单词组成时,第一个单词首字母小写,第二个单词开始首字母大写(小驼峰)
- 常量名:所有字母都大写,多单词之间用下划线连接
键盘输入语句
- 用于接收用户输入的数据
- 步骤:
- 导入Scanner类所在包,java.util.*
- 创建Scanner对象,new创建一个对象
//键盘输入语句练习
Scanner myScanner = new Scanner(System.in);
System.out.println("请输入名字");
String name = myScanner.next();
System.out.println("请输入工资");
int salary = myScanner.nextInt();
System.out.println("人的信息如下:");
System.out.println("名字:" + name + "工资:" + salary);
进制
- 二进制:以0b或0B开头
- 八进制:以数字0开头
- 十六进制:以0x或0X开头
- 二、八、十六进制转十进制:从最低位开始,将每个位上的数提取出来,乘以2、8、16的(位数-1)次方
- 十进制转二、八、十六进制:将该数不断除以2、8、16,直到商为0为止,将每步得到的余数倒过来,就是对应的二、八、十六进制(二进制最高位补齐,一个字节八位)
- 二进制转八、十六进制:从低位开始,将二进制数每三、四位一组,转成对应的八、十六进制数
- 八、十六进制转二进制:将八、十六进制每一位,转成对应的一个三、四位的二进制数即可
位运算
- 7个位运算符
- 按位与&:两位全为1,结果为1,否则为0
- 按位或|:两位中有一个为1,结果为1,否则为0
- 按位异或^:两位一个为0,一个为1,结果为1,否则为0
- 按位取反~:0->1,1->0
- 2&3运算过程:(int型四个字节,三十二位)
- 先得到2的补码=>2的原码 00000000 00000000 00000000 00000010
- 3的补码=>3的原码 00000000 00000000 00000000 00000011
- 按位与
- 00000000 00000000 00000000 00000010
- 00000000 00000000 00000000 00000011
- 00000000 00000000 00000000 00000010 //结果为运算后得到的补码
- 运算后的原码也是这个(正数三码合一),结果是2
- ~-2运算过程:
- 先得到-2的原码 10000000 00000000 00000000 00000010
- 得到-2的反码 11111111 11111111 11111111 11111101
- 得到-2的补码 11111111 11111111 11111111 11111110
- 按位取反~ 00000000 00000000 00000000 00000001
- 得到的是运算后的补码,因为为正数,所以原码一样,结果为1
- ~2运算过程:
- 得到2的补码 00000000 00000000 00000000 00000010
- 按位取反 11111111 11111111 11111111 11111101 补码
- 补码转换成原码:先-1得到反码,然后符号位不变,其他位取反得到原码
- 反码:11111111 11111111 11111111 11111100
- 原码:10000000 00000000 00000000 00000011 结果为-3
- 算数右移>>:低位溢出,符号位不变,并用符号位补溢出的高位
- 1>>2:本质:1/2/2=0
- 算术左移<<:符号位不变,低位补0
- 1<<2:本质:122=4
原码、反码、补码
- 二进制的最高位是符号位:0表示正数,1表示负数
- 正数的原码、反码、补码都一样(三码合一)
- 负数的反码=它的原码符号位不变,其他位取反
- 负数的补码=它的反码+1,负数的反码=负数的补码-1
- 0的反码、补码都是0
- java没有无符号位,换言之,java中的数都是有符号的
- 在计算机运算的时候,都是以补码的方式运算的,但结果是原码
- 当我们看运算结果的时候,要看他的原码(重点)