运算符
算术运算符
% 取模运算 - 取余运算
%的结果的正负看的是%左边数据的正负 -> 如果左边的数字是一个正数,那么结果就是正数;反之,那么结果就是负数
++/-- 自增/自减运算
i++ (先赋值后使用) ++i(先使用后赋值)
byte/short/char可以参与赋值运算
int i = 7;
// 相当于在原来的基础上来自加1
// 先将i的值7取出来标记为结果,然后i自增为8,最后再将7赋值给j
// int j = i++;
// 先将i自增为8,然后再将i的值赋值给j
// int j = ++i;
// 先将i的值7取出来参与后续运算,然后i自增为8,用7参与乘法运算,结果就是14,最后将计算的14赋值给j
// int j = i++ * 2;
// 先将i自增为8,然后将8取出来参与乘法运算,结果结果是16
int j = ++i * 2;
ASCII码表:
‘a’ ~ ‘z’ -> 97~122 ‘A’ ~ ‘Z’ -> 65~90 ‘0’ ~ ‘9’ -> 48~57
赋值运算符
= += -= *= /= %= &= |= ^= <<= >>= >>>=
byte/short/char可以参与赋值运算
除了=以外,其余的符号都要求这个变量得先有值
int i = j = k = 10;错 int i,j,k; i = j = k =10;对
注意:在Java中不支持连等定义但是支持连等赋值
int i = 5;
i += i *= i -= 3; -> 15
i = 5 + (5 * (5 - 3));从左往右依次运算,i的值没变。
关系/比较运算符
==相等 !=不等 > < >= <=
注意:不支持连着的比较方式
逻辑运算符
&与 |或 !非 ^异或 &&短路与 ||短路或
注意:逻辑运算符算的是逻辑值
^异或 — 相同为false,不同为true
注意:||如果在&&的前边可以把&&短路掉
位运算符
注意:位运算符针对整数的补码进行运算,所以运算结果也是补码
& | ^ << >> >>> ~取反
三元运算符
三元表达式中的两个式子的结果类型必须能够转化
格式:逻辑值 ? 表达式1 : 表达式2
执行顺序:先执行逻辑值,如果逻辑值为true,则执行表达式1;反之则执行表达式2
三元表达式本身是一个表达式,意味着这个表达式执行完成之后需要有一个结果 — 这个结果必须能定义对应类型的变量来接住
a > b ? “abc” : true; -> 没有办法定义一个统一类型的结果来存储,这种写法就是错误的
int max = i > j ? i : j; 两个数中的最大值
int max = i > j ? (i > k ? i : k) : (j > k ? j : k); 三个数中的最大值 (嵌套)
运算符的优先级
~ ! ++ – * / % + - << >> >>> 关系 逻辑 & | ^ 三元 赋值
(~ ! ++ --)一元(* / %)(+ -)( << >> >>> )关系 逻辑 ( & | ^ )(二元)三元 赋值
一元 > 二元 > 三元 > 赋值
交换值的方式
方式一:异或法
int i = 5, j = 9;
i = i ^ j;
j = i ^ j; -> j = i ^ j ^ j; -> j = i;
i = i ^ j; -> i = i ^ j ^ i; -> i = j;
方式二:加减法
int i =5, j = 9;
i = i + j;
j = i - j; -> j = i + j - j; -> j = i;
i = i - j; -> i = i + j - i; -> i = j;
方式三:追尾法
int i = 5, j = 9;
int temp = i;
i = j;
j = temp;
总结:三种方式的比较
异或法的效率是最高的。只能针对整数进行交换,局限性太大
加减法的效率是低于异或但是高于追尾。理论上可以交换数值类型,但实际上很少用于交换小数
追尾法的效率是最低的。可以交换任意一个类型的值
变量
在程序中用于存储数据的容器。
变量不能重名。
变量必须先定义后使用
变量必须先给值后使用
变量必须在哪儿定义就在哪儿使用
扩展:计算机存储单位
注意:
如果if中的代码块只有1句话,那么可以省略{}不写
import java.util.Scanner;
Scanner s = new Scanner(System.in);
int i = s.nextInt(); // 获取整数
double d = s.nextDouble(); // 获取小数
String str = s.next(); // 获取字符串
注意:基本类型和包装类的区别 int 和 Integer 等
注意:规定用 0表示当前类型的最小值
小知识
byte b = 127;
// 在底层自动做了一次强制转换
b++;
System.out.println(b);
// byte b = 130;
// 3和5是两个字面量,字面量在参与运算的时候会自动的优化
// 在编译时期就会自动计算
// byte b = 8;
// byte b = 3 + 5;
// System.out.println(b);
每一个二进制数字称之为1位 --- bit - b
字节 - Byte - B 1B = 8b
千字节 - kilobyte - KB 1KB = 210B = 1024B
兆字节 - MB -> GB -> TB -> PB
8Mb = 1MB
100Mb = 12.5MB
3GB = 3000MB --- 在通信领域是按照千进制计算
1 2 4 8 16 32 64 128 256 512 300 -> 100101100 转二进制时,可以从最高位开始逐位往下推。
0111 1111 -> 127 1111 1111 -> -127 1000 0000 -> -128 == -0(负) 0000 0000 -> 0(正)
-128 的原、反、补码是一样的!(规定)
5 << 32 = 5 移位的位数 % 32 后是一样的。 5 << 35 = 40
0111 1111 ->127 + 1 = 1000 0000 -> -128(-0) + 1 = -127 大类型转换为小类型,因为字节的损失可能导致数据不精确,因为可能会产生负数。计算机里大转小就是这么转圈玩的。
只有2^0才肯能是1,所以1 2 4 8 ……,奇数的补码末位是1,偶数是0,无论正负!
整数可以自动转化为小数,可能会产生精度损失,会四舍五入!大数字自动用科学计数法了。
小数转二进制可能是无限的,除了小数是1/2^n,但计算机的内存是有限的,所以会产生误差。