表达式:由操作数和符号组成的式子
操作数:变量、常量和字面量
变量:可以随时改变变量所代表的值
eg:
int a = 10;
a = 100;
常量:常量值一旦确定不可更改
//为了区分常量和变量,一般情况下常量名纯大写
final int AGE = 100;
//3、5等这些值为字面量
运算符
赋值运算符:= 将符号右边的内容赋值给左边
算数运算符:+ - * / %
除法运算如果只有整数参与结果只获取整数部分
a = 10 / 20;
System.out.println("a = "+ a);
// 除法运算如果有小数参与就是正常运算
double d = 10 /20;
System.out.println("d ="+ d);
// 取余运算(取模)
a = 10 % 30;
System.out.println("a = "+ a);
d = 10.5 % 3;
System.out.println("d = "+ d);
复合运算符:+= -= %= /= *=
int c = 10;
c += 100;// c = c + 100;表示在c原有基础上加100
System.out.println("c ="+ c);
byte e = 100;
byte r = e + 1;
byte 、short等变量参与的算术运算,结果时int类型
byte e = 100;
//复合运算符会帮助我们进行类型转换
e += 100;
//关系运算符:> < >= == <= != 关系表达式的结果肯定是布尔值
boolean bool = a <= d;
System.out.println(bool);
//++ --自增自减: 在变量原有基础上加1或者减1
a = 10;
++a;//在不参与其他运算时 ++a 与 a++相同
/*
* 参与其他运算时,++在后,先参与其他运算,再自增
*/
int x = a++;
System.out.println("x = "+ x);
System.out.println("a ="+ a);
a = 10;
x =--a + a++ * ++a;//自左向右先搞定a的值
System.out.println("x ="+ x);
/*
* 三目运算符:?值1:值2
* 当?前面的表达式结果为true,整体式子结果为值1反之为值2
*/
int bu = 10 > 5 ? 10 : 20;
System.out.println("bu = "+ bu);
/*
* 逻辑运算符:&& || !
* 逻辑运算符只能链接结果为布尔值的表达式
* 例如 5 && 8 这是错误的 10 > 5 && false则为正确
*
*/
//&&:有假即为假
boolean res = 100 >101 && 5>3;
System.out.println("res = "+ res);
//&& 短路与:与连接的所有表达式,只要有假后续表达式不再执行
res = 5 < 3 && a++ > 7 ;
//& 通路与:它与短路与结果相同,只是在某个表达式false仍然会继续执行
System.out.println("res = "+ res);
System.out.println("a = "+ a);
// ||:有真即为真 ||也被称为短路或 |被称为通路或
//|| 短路或:与连接的所有表达式,只要有假后续表达式不再执行
res = 5 < 3 || a++ > 7 ;
//| 通路或:它与短路或结果相同,只是在某个表达式false仍然会继续执行
System.out.println("res = "+ res);
System.out.println("a = "+ a);
// !取反:true取反为false false取反为true
System.out.println( !(5 > 3) );//!取反优先度很高
/*
* 位运算符:<<(左移)、>>(右移)、&、|、^(异或)、~(取反)
* 将数字转换成二进制后,再进行运算
*/
//6左移1位 110 变为 11000 左移乘以2的n次幂右移除以2的n次幂
a = 6 << 2;
System.out.println("a = "+ a);
//&:按位与将数字变为二进制,对应位上的数字进行运算,有0即为0
/*
* 101
* 110
* 100
*/
a = 5 & 6;
System.out.println("a = "+ a);
//|:按位或将数字变为二进制,对应位上的数字进行运算,有1即为1
/*
* 101
* 110
* 111
*/
a = 5 | 6;
System.out.println("a = "+ a);
//^:异或 相同即为0不同则为1
/*
* 101
* 110
* 011
*/
a = 5 ^ 6;
System.out.println("a = "+ a);
/*
* ~按位取反
* 原码 、 反码 、补码
* 原码按位取反为反码
* 反码加一为补码
* 正数的原码、反码、补码都相同 例如5的原反补:0000 0101
* 负数在计算机中是以补码的形式存在,负数反码在符号位不变的情况下,其余位取反
* 补码就是负数反码基础上加1
*
* -5
* 原码:1000 0101
* 反码:1111 1010
* 补码:1111 1011
*/
/*
* 0000 0110
* ~取反后
* 1111 1001(补码)
* 由于符号位变成了1了所以是负数,负数在计算机中是补码,算出原码
* 反码1111 1000
* 原码1000 0111
*/
int m = ~6;
System.out.println("m = "+ m);
/*
* 原码:1000 0001
* 反码:1111 1110
* 补码:1111 1111
*
* ~取反 负数实在补码的基础上进行~运算
* 0000 000
* 取反后最高位位0 ,是整数可以直接使用
*/
int k = ~-1;
System.out.println("k ="+ k);
//无论正数还是负数~n 为-(n+1)