运算符——java

目录

一、算术运算符

1. 基本四则运算符:加减乘除模(+ - * / %)

 2. 增量运算符 +=  -=  *=  /=  %=

3. 自增/自减运算符 ++ --

 二、 关系运算符 ==  !=  <  >  <=  >=

三、 逻辑运算符

1. 逻辑与 &&

2. 逻辑或 ||  

3. 逻辑非 !  

四、位运算符  

1. 按位与 &

2. 按位或 |

3. 按位取反 ~

4. 按位异或 ^

五、移位运算

1. 左移 <<

2. 右移 >>

3. 无符号右移 >>>

 六、条件运算符(表达式1 ? 表达式2 : 表达式3)

七、 运算符的优先级 


定义:对操作数进行操作时的符号,不同运算符操作的含义不同。
作为一门计算机语言, Java 也提供了一套丰富的运算符来操纵变量。 Java 中运算符可分为以下:算术运算符 、关系运算符 、逻辑运算符、位运算符、移位运算符以及条件运算符等。

一、算术运算符

1. 基本四则运算符:加减乘除模(+ - * / %)

注意:

1)都是二元运算符,使用时必须左右有两个数。

int a = 20 ;
int b = 10 ;
System . out . println ( a + b ); // 30
System . out . println ( a - b ); // 10
System . out . println ( a * b ); // 200
System . out . println ( a / b ); // 2
System . out . println ( a % b ); // 0
2) int / int 结果还是 int 类型,而且会向下取整,即舍弃小数点后面的数
int a = 3 ;
int b = 2 ;
// 在数学中应该是 1.5 但是在 Java 中输出结果为 1 会向下取整,即小数点之后全部舍弃掉了
System . out . println ( a / b );
// 如果要得到数学中的结果,可以使用如下方式
double d = a * 1.0 / b ;
System . out . println ( d );

3) 做除法和取模时,右操作数不能为0

int a = 1 ;
int b = 0 ;
System . out . println ( a / b )
//运行结果(错误)
Exception in thread "main" java . lang . ArithmeticException : / by zero
at Test . main ( Test . java : 5 )

4)% 不仅可以对整型取模,也可以对double类型取模,但是没有意义,一般都是对整型取模的

System . out . println ( 11.5 % 2.0 );
// 运行结果
1.5
5)对负数取模或模负数,只有当%前面的数为负数结果才是负数,%后面的数无所谓
System.out.println(7%3);//1
System.out.println(7%-3);//1
System.out.println(-7%3);//-1
System.out.println(-7%-3);//-1
6) 两侧操作数类型不一致时,向类型大的提升
System . out . println ( 1 + 0.2 ); // +的左侧默认是int,右侧默认是double,在加之前int被提升为                                                 double
// 故:输出 1.2

 2. 增量运算符 +=  -=  *=  /=  %=

该种类型运算符操作完成后,会将操纵的结果赋值给左操作数。

注意:只有变量才能使用该运算符,常量不能使用。
int a = 1 ;
a += 2 ; // 相当于 a = a + 2
System . out . println ( a ); // 输出 3
a -= 1 ; // 相当于 a = a - 1
System . out . println ( a ); // 输出 2
a *= 3 ; // 相当于 a = a * 3
System . out . println ( a ); // 输出 6
a /= 3 ; // 相当于 a = a / 3
System . out . println ( a ); // 输出 2
a %= 3 ; // 相当于 a = a % 2
System . out . println ( a ); // 输出 2

3. 自增/自减运算符 ++ --

++是给变量的值+1--是给变量的值-1

注意:
1、如果单独使用,【前置 ++ 】和【后置 ++ 】没有任何区别
2、如果混合使用,【前置 ++ 】先 +1 ,然后使用变量 +1 之后的值,【后置 ++ 】先使用变量原来的值,表达式结束时给变量+1
3、只有变量才能使用自增 / 自减运算符,常量不能使用,因为常量不允许被修改
int a = 1 ;
// 后置++
a ++ ; // 后置 ++单独使用  表示给 a 的值加 1 ,此时 a 的值为 2
System . out . println ( a ++ ); // 注意:后置 ++混合使用  是先使用变量原来值,表示式结束时给变量 +1 ,因此输出 2
System . out . println ( a ); // 输出 3
// 前置 ++
++ a ; // 前置 ++单独使用  表示给 a 的值加 1,a=4
System . out . println ( ++ a ); // 前置 ++混合使用  是先给变量 +1 ,然后使用变量中的值,因此输出 5
System . out . println ( a ); // 输出 5
// -- 操作符给操作 -1 ,与 ++ 含义类似

 二、 关系运算符 ==  !=  <  >  <=  >=

关系运算符主要有六个: == != < > <= >= ,其计算结果是 true 或者 false

int a = 10 ;
int b = 20 ;
// 注意:在 Java = 表示赋值,要与数学中的含义区分
// Java == 表示相等
System . out . println ( a == b ); // false
System . out . println ( a != b ); // true
System . out . println ( a < b ); // true
System . out . println ( a > b ); // false
System . out . println ( a <= b ); // true
System . out . println ( a >= b ); // false

注意:当需要多次判断时,不能连着写,比如:3 < a < 5Java程序与数学中是有区别的 

三、 逻辑运算符

逻辑运算符主要有三个 : && || ! ,运算结果都是 boolean 类型。

1. 逻辑与 &&

语法规则:表达式 1 && 表达式 2 左右表达式必须是 boolean 类型的结果,即左右表达式必须是由关系运算符连接。
两边都真才为真。
运算符——java_第1张图片
int a = 1 ;
int b = 2 ;
System . out . println ( a == 1 && b == 2 ); // 左为真 且 右为真 则结果为真,打印true
System . out . println ( a == 1 && b > 100 ); // 左为真 但 右为假 则结果为假,打印false
System . out . println ( a > 100 && b == 2 ); // 左为假 但 右为真 则结果为假,打印false
System . out . println ( a > 100 && b > 100 ); // 左为假 且 右为假 则结果为假,打印false

 补充:

逻辑与又叫短路与,遵守短路求值的规则,当表达式1为假时,此时结果一定为假,则表达式2的真假不会去判断,所以当表达式2非法时,也不会报错。

System.out.println(10 > 20 && 10 / 0 == 0); // 打印 false,不会报错!

//我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.

2. 逻辑或 ||  

语法规则:表达式 1 || 表达式 2 左右表达式必须是 boolean类型的结果,即左右表达式必须是由关系运算符连接。
两边都假才为假。
运算符——java_第2张图片
int a = 1 ;
int b = 2 ;
System . out . println ( a == 1 || b == 2 ); // 左为真 且 右为真 则结果为真
System . out . println ( a == 1 || b > 100 ); // 左为真 但 右为假 则结果也为真
System . out . println ( a > 100 || b == 2 ); // 左为假 但 右为真 则结果也为真
System . out . println ( a > 100 || b > 100 ); // 左为假 且 右为假 则结果为假

 补充:

逻辑或又叫短路或,遵守短路求值的规则当表达式1为真时,此时结果一定为真,则表达式2的真假不会去判断,所以当表达式2非法时,也不会报错。

System . out . println ( 10 < 20 ||  10 / 0 == 0 ); // 打印true,不会报错!
//我们都知道, 计算 10 / 0 会导致程序抛出异常. 但是上面的代码却能正常运行, 说明 10 / 0 并没有真正被求值.

3. 逻辑非 !  

语法规则:! 表达式  (boolean类型)

真变假,假变真。

运算符——java_第3张图片

int a = 1 ;
System . out . println ( ! ( a == 1 )); // a == 1 true ,取个非就是 false
System . out . println ( ! ( a != 1 )); // a != 1 false ,取个非就是 true
注:这里与c语言不同, c语言可以用!a !b,但java不可以,java中!后只能跟boolean类型表达式

四、位运算符  

位运算符主要有四个 : &  |  ~  ^   ,除 ~ 是一元运算符外,其余都是二元运算符。
位运算符操作的对象为比特位。

1. 按位与 &

 语法规则:如果两个二进制位都是 1, 则结果为 1, 否则结果为 0.

例: 

int a = 10 ;
int b = 20 ;
System . out . println ( a & b ); //结果输出为0
运算符——java_第4张图片

2. 按位或 |

语法规则: 如果两个二进制位都是 0, 则结果为 0, 否则结果为 1.  

例:

int a = 10 ;
int b = 20 ;
System . out . println ( a | b ); //输出结果为30
运算符——java_第5张图片
注意 :
1、& | 如果表达式结果为 boolean , 也表示逻辑运算 . 但与 && || 相比 , 它们 不支持短路求值.
System . out . println ( 10 > 20 & 10 / 0 == 0 ); // 程序抛出异常
System . out . println ( 10 < 20 | 10 / 0 == 0 ); // 程序抛出异常
2、  & | 的操作数为整数 (int, short, long, byte) 的时候 , 表示按位运算 , 当操作数为 boolean 的时候, 表示逻辑运算.
System . out . println ( a == 1 & b == 2 ); //与&&含义相同
System . out . println ( a == 1 b == 2 ); //与||含义相同

3. 按位取反 ~

语法规则: 如果该位为 0 则转为 1, 如果该位为 1 则转为 0  

int a = 0xf ;
System . out . printf ( "%x\n" , ~a );
//输出结果为0xfffffff0
注意:
1、0x 前缀的数字为 十六进制 数字 . 十六进制可以看成是二进制的简化表示方式 . 一个十六进制数字对应 4个二进制位.
2、0xf 表示 10 进制的 15, 也就是二进制的 1111
3、int类型占32个bit,前28位为0,后4位为1,按位取反后,前28位为1,后4位为0,用二进制形式表示为0xfffffff0
4、 printf 能够格式化输出内容 , %x 表示按照十六进制输出 .
5、\n 表示换行符

4. 按位异或 ^

语法规则: 如果两个数字的二进制位相同 , 则结果为 0, 相异则结果为 1.
int a = 0x1 ; //00000001
int b = 0x2 ; //00000010
System . out . printf ( "%x\n" , a ^ b ); //输出结果为3

 注意:如果两个数相同,则异或的结果为0

五、移位运算

移位运算符有三个: << >> >>> ,都是二元运算符,且都是按照二进制比特位来运算的。 

1. 左移 <<

语法规则:最左侧位不要了, 最右侧补 0.
注意:向左移位时,丢弃的是符号位,因此正数左移可能会编程负数
int a = 0x10 ; //表示十进制的16,二进制表示为00010000
System . out . printf ( "%x\n" , a << 1 );
// 运行结果(注意, 是按十六进制打印的) 20

运算符——java_第6张图片

2. 右移 >>

语法规则: 最右侧位不要了, 最左侧补符号位(正数补0, 负数补1) 

int a = 0x10 ; //表示十进制的16,二进制表示为00010000
System . out . printf ( "%x\n" , a >> 1 );
// 运行结果 ( 注意 , 是按十六进制打印的 ) 8
运算符——java_第7张图片
int b = 0xffff0000 ;
System . out . printf ( "%x\n" , b >> 1 );
// 运行结果(注意, 是按十六进制打印的) ffff8000

3. 无符号右移 >>>

语法规则: 最右侧位不要了, 最左侧补 0. 

int a = 0xffffffff ;
System . out . printf ( "%x\n" , a >>> 1 );
// 运行结果(注意, 是按十六进制打印的) 7fffffff

注意: (一般情况下)

1. 左移 1 , 相当于原数字 * 2. 左移 N , 相当于原数字 * 2 N 次方 .
2. 右移 1 , 相当于原数字 / 2. 右移 N , 相当于原数字 / 2 N 次方 .
3. 由于计算机计算移位效率高于计算乘除 , 当某个代码正好乘除 2 N 次方的时候可以用移位运算代替 .
4. 移动负数位或者移位位数过大都没有意义 .

 六、条件运算符(表达式1 ? 表达式2 : 表达式3

条件运算符只有一个 :
表达式 1 ? 表达式 2 : 表达式 3
表达式 1 的值为 true , 整个表达式的值为 表达式 2 的值 ;
表达式 1 的值为 false , 整个表达式的值为 表达式 3 的值 .
也是 Java 中唯一的一个 三目运算符 , 是条件判断语句的简化写法
表达式必须是boolean类型的
// 求两个整数的最大值
int a = 10 ;
int b = 20 ;
int max = a > b ? a : b ;

注意:

1. 表达式2和表达式3的结果要是同类型的,除非能发生类型隐式类型转换 

int a = 10 ;
int b = 20 ;
int c = a > b ? 1 : 2.0 ; //错误

2. 表达式不能单独存在,其产生的结果必须要被使用

int a = 10 ;
int b = 20 ;
a > b ? a : b ; // 报错: Error:(15, 14) java: 不是语句

 下述代码的结果为?

     boolean flag = true == true ? true : true == false ? false : false;
//                     ①为真         ②
     boolean flag1 = true == false ? true : true == false ? false : false;
//                     ①为假                     ②为假                 ③

运算符——java_第8张图片

七、 运算符的优先级 

// a b 的平均值
int a = 10 ;
int b = 20 ;
int c = a + ( b - a ) >> 1 ;
System . out . println ( c ); //输出结果为10
上述表达式中,由于 + 的优先级要高于 >> , 因此 a 先和 b-a 的结果做加法,整体为 20 ,最后再进行右移,因此结果为10
注意:运算符之间是有 优先级 . 具体的规则我们 不必记忆 . 在可能存在歧义的代码中 加上括号 即可 .
//改正
// a b 的平均值
int a = 10 ;
int b = 20 ;
int c = a + (( b - a ) >> 1 );
System . out . println ( c );

 这次的分享就到这里,谢谢大家的点赞支持!!!

你可能感兴趣的:(javaSE,java,开发语言)