表达式与运算符
表达式
- 表达式由运算符和操作数组成,根据运算符也可分为单目表达式、双目表达式、三目表达式
- 计算:表达式的结果是以最大类型的操作数为标准,其他小类型自动转换成最大类型然后进行运算。
- 例如:
int a,b = 3; double c = 3.5; double d = a + b + c;
//结果为double类型 - 注意:这些都是表达式 -> 5、num1、num1 + num2、sum = num1 + num2
运算符
主要包含算术运算符, 赋值运算符, 关系运算符, 逻辑运算符, 条件运算符, 位运算符
算术运算符
- 算术运算符主要用于基本的算术运算,如加减乘除等
- 包括:加(+) 减(-) 乘(*) 除(/) 取模(%) 自加(++) 自减(--)
- +的用法:a.加号;b.正号; c.字符串连接符,如:
""+10+5
//105 - 除法:两个int相除结果为整型,13/5 -> 2 、13.0/5 -> 2.6
- 取模:13%5 -> 3 、13.5/5 -> 3.5
自增自减运算符
x++ 是先赋值后自增,x-- 同理;++x 是先自增后赋值,--x 同理
示例:int x = 4; int y = (x++)+5;
//y的结果为9,x先进行加法然后赋值,最后在自增
赋值运算符
格式:变量 = 表达式;
注意:赋值运算符是从右往左运算,赋值运算符的左边不能是常量
例如:int n = 5;
//将5赋值给变量n int m = n;
//将变量n的值赋值给变量m
复合赋值运算符
关系运算符
- 比较运算符用于判断两个数据的大小,主要用于条件和循环语句中的判断条件
- 包括:==、!=、>、<、>=、<=,运算结果为boolean值,即true或者false
-
'A' > 'B'
结果为false,比较的是两个字符的ASCII值
true == false
结果为false,两个布尔值不相等
float f = 5.0f; long l = 5; f==l;
结果为true,浮点数与整数比较,只要值相等就为true
逻辑运算符
- 逻辑运算符用来连接一个或多个条件,判断这些条件是否成立
- 包括:AND(&&)、OR(||)、NOT(!)、异或(^)、& 、|
- 运算结果为boolean值,即true或者false
- 注意:逻辑运算符的操作数operator都是布尔类型的
- 逻辑"与"运算符,必须左右两个条件都为true才为true
- 逻辑"或"运算符,左右任一条件为true则为true
- 逻辑"非"运算符,对原条件进行取反,操作数为true结果为false,操作数为false结果为true
区分&& 与 &:
&&运算符又叫短路运算符,如果第一个表达式的值就能决定表达式最后的结果,运算符右边的表达式就不再计算了,而&则都会计算。同理 || 叫做短路或,a || b 一旦a为true则b不在进行判断,而 | 都要进行判断。
例如:
int n = 3; boolean b=(3 > 7)&&((n++)<2)
=> b=false,n=3(不会自增)
条件运算符
- java中的条件运算符是三目运算符(三元运算符)
- 语法:布尔表达式 ?表达式1 : 表达式2,如:3 > 2 ? a : b 输出为a
当布尔表达式的值为true时,返回表达式1的值,否则返回表达式2的值 - 示例:计算3个数最大值 ->
int max = (x > y ? (x>z ? x: z) : (y>z ? y : z));
- 单目运算符 ++,--
- 双目运算符 +,-,*,/,&&,>,>=, ==, !=等
注意:三元运算符实现的,都可以采用if语句实现。反之不成立。
当if语句控制的操作是一个输出语句的时候就不能使用三元运算符。因为三元运算符是一个运算符,运算符操作完毕就应该有一个结果,而不是一个输出语句。
运算符的优先级
以下运算符优先级从高到底,实际使用运算符根据逻辑多添加括号增加可读性且不容易出错
整体优先级:算术运算符>关系运算符>逻辑运算符>赋值运算符 一元>二元>三元运算符
位运算符(扩展)
- 位运算是直接对二进制补码进行运算
- 包含:&(与),|(或),^(异或) , ~(按位取反) ,<<(左移) ,>>(右移) ,>>>(无符号右移)
-
"<<":
左移 左边最高位丢弃,右边补齐0 -
">>":
右移 最高位是0,左边就补0;最高位是1,左边补齐1 -
">>>":
无符号右移 无论最高位是 0还是1,左边补齐0
运算规律
- 位异或特点,某个数据异或另一个数据两次得到的结果是其本身。
即a ^ b ^ b = a
-
&:
有0则0;|:
有1则1;^:
相同则0不同则1;~:
按位取反 -
"<<":
把<<左边的数据乘以2的移动次幂 -
">>":
把>>左边的数据除以2的移动次幂
示例一:
public static void main(String[] args) {
int a = 3;
int b = 4;
System.out.println(a & b);
System.out.println(a | b);
System.out.println(a ^ b);
System.out.println( ~ a);
}
/*int a 3 0b11 4个字节
原码 00000000 00000000 00000000 00000011
补码 00000000 00000000 00000000 00000011
int b 4 0b100 4个字节
原码 00000000 00000000 00000000 00000100
补码 00000000 00000000 00000000 00000100
位与& 有0则0
00000000 00000000 00000000 00000011
& 00000000 00000000 00000000 00000100
--------------------------------------------------
00000000 00000000 00000000 00000000 补码
原码 00000000 00000000 00000000 00000000
结果:0
位或| 有1则1
00000000 00000000 00000000 00000011
| 00000000 00000000 00000000 00000100
--------------------------------------------------
00000000 00000000 00000000 00000111 补码
原码跟补码一样
结果:7
位异或^ 相同为0 不同为1
00000000 00000000 00000000 00000011
^ 00000000 00000000 00000000 00000100
--------------------------------------------------
00000000 00000000 00000000 00000111 补码
原码补码相同
结果:7
~按位取反 0变1,1变0
00000000 00000000 00000000 00000011
--------------------------------------------
~ 11111111 11111111 11111111 11111100 补码
补码:11111111 11111111 11111111 11111100
反码:11111111 11111111 11111111 11111011
原码:10000000 00000000 00000000 00000100
数值位是4
符号位-
结果 -4
*/
示例二:
public static void main(String[] args) {
//左移相当于把<<左边的数乘以2的移动次方(幂)
System.out.println(3<<2);//12=3*4=3*2^2
//右移相当于把>>左边的数除以2的移动次方(幂)
System.out.println(24>>2);//24/4=6
System.out.println(24>>>2);//24/4=6
System.out.println(-24>>2);//-24/4=-6
}
示例三:计算-15 >>> 2