|-- 算术运算符
|-- 比较(关系)运算符
|-- 逻辑运算符
|-- 自加和自减运算符
|-- 赋值运算符
|-- 三目运算符
|-- 位运算符
程序控制流程(三大流程) |-- 顺序 |-- 选择 |-- 循环
算术运算符:
+
-
*
/
%
算术运算符的注意问题
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部
分。
“+”除字符串相加功能外,还能把非字符串转换成字符串 。“+”运算符两侧的操作数中只要有一个
String类型,一个是基本数据类型时,编译成class文件后,两个操作数就被连接成了一个新的String值。
比较(关系)运算符:
>
<
>=
<=
!=
==
比较运算符的结果是boolean类型
逻辑运算符:
连接多个条件的关联关系的
与 && & // 表示的是并且关系,全部为真则为真,否则为假 或 || | // 表示或者的关系,只要一者为真则为真,全部为假才为假 非 ! // 否定,取反
&& ||
短路与
短路或
知道结果不做更多的判断
短路与/或的效率更高,在编程建议使用短路与和短路或
自加和自减运算符:
++a
a++
--a
a--
前加加和后加加的优先级别不同引起的!!!!! 前加加的优先级别非常高,仅次于括号 后加加的优先级别非常非常低,甚至比赋值符都低
int a = 10;
int b,c ;
b = a++;
b = 10;
a =11;//因为优先级低所以先赋值再自加
c = ++a;
a = 12;//先自加才赋值
b = 12;
赋值运算符:
= // 将等号右侧的值赋给左侧的变量
双目运算符
+= // a += 10 等价于 a = a + 10
-= //同理
*=
/=
%=
三目运算符:
表达式 ? 值1: 值2
int a = 10;
int b = 20;
int c = a > b ? 100 : 200;
如果表达式成立,把值1赋给C
如果表达式不成立,把值2赋给C
位运算符:
计算机底层本质是二进制(半导体)运算
计算机底层使用的二进制运算 进制: 人类最长的使用的10进制 10个个位数: 0 1 2 3 4 5 6 7 8 9 逢10进1 二进制: 个位数只有2个: 0 1 一个字节即8位 无符号的时候: 1111 1111 255 最大值 0000 0000 0 最小值 0~255 256个值 基于正数的二进制运算 byte a = 5 byte b = 10 0000 0101 0000 1010 a + b 0000 0101 0000 1010 --------------- 0000 1111 15 正数的源码、反码、补码一致,也就是正数没有源码、反码、补码之说 源码:数值的二进制状态码 反码:符号位不变,其余各位取反,得到的就是反码 补码:反码+1,就是补码 计算机底层本质上来说,是以补码运行的!!!! 引入负数 符号位的概念 最高位来表示数值的正负:0表示正数;1则表示该数是个负数 byte c = -1 byte d = 2 1000 0001 0000 0010 1000 0011 -3 那么用源码去算就会出现问题 (正数的源码、反码、补码一致,也就是正数没有源码、反码、补码之说) 源码:数值的二进制状态码 反码:符号位不变,其余各位取反,得到的就是反码 补码:反码+1,就是补码 计算机底层本质上来说,是以补码运行的!!!! 0000 0010 2 -1 1000 0001 源码 1111 1110 反码 1111 1111 补码 0000 0010 2 1111 1111 -1的补码 1 0000 0001 -1 因为以字节方式存储所以舍弃最高位 结果为 1 0000 0001 1 1000 0011 -3 -3 + 1 = -2 0000 0001 1 1111 1101 -3的补码 1111 1110 -2的补码 1111 1110 -1 1111 1101 -2的反码 最后结果 1000 0010 -2 无符号时 有符号的时候 0111 1111 +127 1000 0000 -128(将-0变为-128) -128~127 256个值 八进制: 0561 十六进制:0~9 ABCDEF 0xAF89AD 位运算 & // 与运算 | // 或运算符 ^ // 异或运算 ~ // 按位取反 // 下面三个叫做移位运算 << 左移运算符:二进制的补码向左移动(左移比较简单不涉及符号位) >> 有符号右移运算:高位补1 >>> 无符号右移运算:高位补0 int a = 2; 计算机底层以二进制按位存储数据 让a从2变成8的最快方式是左移两位 a << 2 a = 8 & | ^ int a = 10; int b = 11; a & b; // 都为真,则为真 a | b; // 一者为真,则为真 a ^ b; // 相反为真 0000 1010 0000 1011 & 与运算 --------------- 0000 1010 10 0000 1010 0000 1011 | 或运算 ----------- 0000 1011 11 0000 1010 异或运算 0000 1011 ^ 位不同,相反,才为真 --------- 0000 0001 1