3.运算符
运算符是一种特殊的符号,用于表示数据的运算、赋值和比较。
3.1算术运算符
算术运算符是对数值类型的变量进行运算的。
在java中 %(模) 的本质:a % b = a - a / b * b 简记:符号取左边变量的。
++(自增)的一些注意事项
-
i++;先赋值,再自增
int i =2; int j = i++; //i = 3, j = 2
-
++i;先自增,再赋值
int i = 2; int j = ++i; //i =3, j = 3
-
自身++赋值
int i =1; i = i++;
后++,先使用,后自增,很容易理解为i=i,然后i++,得到i = 2;但实际上上面代码结果为i = 1。
这里其实会有一个临时变量temp;i = i++实际过程为
(1)temp = i;(2)i = i + 1;(3)i = temp;
所以最终i = 1。
另外,i = ++i 的执行过程为(1)i = i + 1;(2)temp = i;(3)i = temp。
3.2关系运算符
关系运算符的结果都是boolearn型,要么是true,要么是false。
3.3逻辑运算符
用于连接多个条件(多个关系表达式),最终的结果也是以一个boolean值。
&&与&的区别
&&叫短路与,如果&&符号之前的为false,后面的条件不判断(常用)
&叫逻辑与,不管&符号前是否为false,后面的条件都判断
|| 和 | 和 && 与 & 类似。
^逻辑异或: a^b,当a和b不同时,结果为true,否则为false。
易错题
答案为 50。
首先z++是后加加,所以先判断z和46是否相等然后再自增,相等,&&前为true,此时z为47,然后把true赋值给y,&&后也为真,if语句成立,z++,此时z为48;然后把false赋值给x,||前为false,判断后面表达式,++z,先自增再判断,z为49,z与49相等,||后面表达式成立,if语句成立,z++,z为50。
3.4 赋值运算符
赋值运算符的左边只能是变量,右边可以是变量、表达式、常量值。
复合赋值运算符会进行类型转换,如:byte num = 4; num += 2; 相当于 byte num = 4; num = (byte)(num + 2);
3.5 标识符
标识符规范
- 包名:多单词组成时所有字母都小写:aaa.bbb.ccc
- 类名、接口名:多单词组成时,所有单词的首字母大写:XxxYyyZzz【大驼峰】比如:TankShotGame
- 变量名、方法名:多单词组成时,第一个单词小写,第二个单词开始的每个单词首字母大写:xxxYyyZzz【小驼峰,简称 驼峰法】 比如:stuName
- 常量名:所有字母大写,多单词时每个单词用下划线连接:XXX_YYY_ZZZ 比如:TAX_RATE
3.6 四种进制
- 二进制:0,1,满2进1。以0b或0B开头。如:0b1010(十进制10)
- 十进制:0-9,满10进1。 如:10
- 八进制:0-7,满8进1,以数字0开头表示。 如:012(十进制10)
- 十六进制:0-9以及A(10)-F(15),满16进1,A-F不区分大小写,以0x或0X开头表示。 如:0xA(十进制10)
3.7 原码、补码、反码(重点、难点)
- 二进制最高位是符号位:0表示正数,1表示负数。
- 正数的原码,反码,补码都一样(三码合一)。
- 负数的反码=它的原码符号位不变,其他位取反(0->1,1->0)
- 负数的补码=它的反码+1,负数的反码=负数的补码-1。
- 0的反码,补码都是0。
- java没有无符号数,换言之,java中的数都是有符号的。
- 在计算机运算的时候,都是以补码的形式来运算的。
- 当我们看运算结果的时候,要看他的原码。
3.8 位运算
java中有7个位运算符(&、|、^、~、>>、<<和>>>)
- 按位与&:两位全为1,结果为1,否则为0。
- 按位或|:两位有一个为1,结果为1,否则为0
- 按位异或^:两位一个为0,一个为1,结果为1,否则为0
- 按位取反~:0->1,1->0
- 算术右移>>:低位溢出,符号位不变,并用符号位补溢出的高位,本质是/2
- 算术左移<<:符号位不变,低位补0,本质是*2
- 逻辑右移(无符号右移)>>>:低位溢出,高位补0
特别说明:没有<<<符号。
// 位运算
public class BitOperrator{
public static void main(String[] args){
// 2&3
// 2的原码 00000000 00000000 00000000 00000010
// 2的反码 00000000 00000000 00000000 00000010
// 2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 按位与 &
// 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000010 运算后的补码
// 运算后的原码 00000000 00000000 00000000 00000010
// 结果就是 2
System.out.println(2&3); // 2
//============================================================
// ~-2
// -2的原码 10000000 00000000 00000000 00000010
// -2的反码 11111111 11111111 11111111 11111101
// -2的补码 11111111 11111111 11111111 11111110
// 按位取反 00000000 00000000 00000000 00000001 运算后的补码
// 运算后的原码 00000000 00000000 00000000 00000001
// 结果就是 1
System.out.println(~-2); // 1
//============================================================
// ~2
// 2的补码 00000000 00000000 00000000 00000010
// 按位取反 11111111 11111111 11111111 11111101 运算后的补码
// 运算后的反码 11111111 11111111 11111111 11111100
// 运算后的原码 10000000 00000000 00000000 00000011
// 结果就是 -3
System.out.println(~2); // -3
//============================================================
// 2|3
// 2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 按位或 |
// 00000000 00000000 00000000 00000010
// 00000000 00000000 00000000 00000011
// 00000000 00000000 00000000 00000011 运算后的补码
// 运算后的原码 00000000 00000000 00000000 00000011
// 结果就是 3
System.out.println(2|3); // 3
//============================================================
// 2^3
// 2的补码 00000000 00000000 00000000 00000010
// 3的补码 00000000 00000000 00000000 00000011
// 按位异或 00000000 00000000 00000000 00000001 运算后的补码
// 运算后的原码 00000000 00000000 00000000 00000001
// 结果就是 1
System.out.println(2^3); // 1
//============================================================
System.out.println(1>>2); // 1 / 2 / 2 = 0
System.out.println(1<<2); // 1 * 2 * 2 = 4
}
}