Java 运算符和表达式
运算符就是对字面量(常量)或变量进行操作的符号,例:+(加号)、-(减号)、*(乘号)、/(除号)等;
==运算符又分为算术运算符、关系运算符、逻辑运算符、位运算符、赋值运算符、三元运算符等;==
表达式就是用运算符把字面量(常量)或变量连接起来的符合 Java 语法的式子,例:int c = a + b ,其中 a + b 就是一个表达式;
使用不同的运算符连接起来的表达式体现的是不同类型的表达式。例:
public class demo{
public static void main(String[] args)
{
int a = 10; //定义一个整型变量 a ,赋值为10
int b = 15; //定义一个整型变量 b ,赋值为15
int c = a + b; //定义一个整型变量 c ,赋值为 a + b
//在 int c = a + b 中 + (加号)是算术运算符,所以 a + b 就是算术表达式
System.out.println(c); //输出变量 c 的值
}
}
一、算术运算符及表达式
算术运算符:
符号 | 作用 | 说明 |
---|---|---|
+ | 加 | 加法 |
- | 减 | 减法 |
* | 乘 | 乘法 |
/ | 除 | 除法 |
% | 取模 | 取模(取余)就是取余数 |
++ | 自增 | (两个加号)自身加1 |
- - | 自减 | (两个减号)自身减1 |
加、减、乘、除四则运算我们从小学就开始接触,用法我们都已经很熟悉了,就不过多的阐述了。
% 取模(取余)就是取余数,例:int x = 7 % 3 ( x = 1) ,类似于 7 / 3 = 2 ······1(余数),取模就是只取余数
++、- - 是一元运算符,参与运算的是单变量,其功能是自身加 1 或自身减 1。而它们又可以分为前置运算和后置运算(就是符号放在前面和符号放在后面),如 ++i,i++,- -i,i- -;
自增自减运算符,前置时要先自加或自减再代入表达式,后置时要先代入表达式再进行自加或自减。
例 1:当自增自减运算符前置时
public class Demo1{
public static void main(String[] args){
//当自增自减运算符前置时,先自增自减,再参与运算
int a = 4;
int i = 3;
int j = 3;
int x = ++i * a; // 4 * 4 (++i 时,i 先自加 1( 2 + 1 = 3 ),再代入表达式运算)
int y = --j * a; // 2 * 4 (--i 时,i 先自减 1( 2 - 1 = 1 ),再代入表达式运算)
System.out.println("x = " + x + ",y = "+ y); //输出结果为 x = 16,y = 8
}
}
例 2:当自增自减运算符后置时
public class Demo2{
public static void main(String[] args){
//当自增自减运算符后置时,先参与运算,再自增自减
int a = 4;
int i = 3;
int j = 3;
int x = a * i++; // 4 * 3 ( i++ 时,i 先代入表达式运算,再自加 1( 2 + 1 = 3 ))
int y = a * j--; // 4 * 3 ( i-- 时,i 先代入表达式运算,再自减 1( 2 + 1 = 3 ))
System.out.println("x = "+ x + ",y = " + y); //输出结果为 x = 12,y = 12
}
}
二、关系运算符及表达式
注:程序中的等于符号使用两个等号表示(==),而一个符号(=)在程序是赋值符号
关系运算符用于两个值的比较运算
关系运算符:
符号 | 说明 |
---|---|
> | 大于 |
< | 小于 |
>= | 大于等于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
关系运算符组成关系表达式产生一个布尔值,若关系表达式成立,则生成一个 true 值;不成立则生成一个 false 值。
例:当 x = 10,y = 20 则表达式
x < y 的值为 true ;x > y 的值为 false
三、逻辑运算符及表达式
1、&&( 逻辑与 )
&& 用于两个布尔逻辑或关系表达式的与运算;
&& (与)运算的一般形式是:A && B
当 A 、B 是布尔逻辑或关系表达式时,若 A 和 B 都为 true ,则 A && B 的值为 true,否则只要其中一个为 false ,则 A && B 的值为 false
==与运算时,同真为真,有假则假==
例:当 x = 10,y = 20,z = 30 ,则表达式
( x < y )&& ( y < z ) 的值为 true(因为表达式 x < y 成立,值为真;y < z 成立,值为真;同时为真则为真)
( x > y )&& ( y < z ) 的值为 true(因为表达式 x > y 不成立,值为假;y < z 成立,值为真,有假则假)
2、|| (逻辑或)
|| 用于布尔逻辑或关系表达式的或运算
|| (或)运算的一般形式是:A || B
当 A 、B 是布尔逻辑或关系表达式时,若 A 和 B 中只要其中有一个值为 true ,则 A || B 的值为 true;而要 A || B 的值为 false ,则必须同时都为 false 才行
==或运算时,有真则真,同假为假==
例:当 x = 10,y = 20,z = 30 ,则表达式
( x < y )|| ( y < z ) 的值为 true(因为表达式 x < y 成立,值为真;y < z 成立,值为真;只要有一个为真则为真)
( x > y )|| ( y < z ) 的值为 true(因为表达式 x > y 不成立,值为假;y < z 成立,值为真;只要有一个为真则为真)
( x > y )|| ( y > z ) 的值为 false(因为表达式 x > y 不成立,值为假;y > z 不成立,值为假;都为假才为假)
3、!(逻辑非)
!用于单个逻辑或关系表达式的运算,作用是操作数取反
!(非)运算的一般形式是: !A
其中 A 是布尔关系或逻辑表达式,若 A 的值为 true,则 !A 的值为 false;若 A 的值为 false ,则 !A 的值为 true
==非运算,真变假,假变真==
例:若 x = 20,y = 30,则表达式
!( x > y ) 的值为 true(因为 x > y 不成立,值为假;而经过非运算后值为真)
!( x < y ) 的值为 false(因为 x < y 成立,值为真;而经过非运算后值为假)
四、位运算符及表达式
1、移位运算
(1)位右移运算( >> )
位右移符号 >> 用于整数的二进制位右移运算,在移位操作的过程中,符号位不变,其他位右移
例:将整数 A 进行右移 2 位的操作:A >> 2
(2)位右移运算( << )
位左移符号 << 用于整数的二进制位左移运算,在移位操作的过程中,左边的位移除(舍弃),右边的位补 0
例:将整数 A 进行左移 2 位的操作:A << 2
(3)不带符号右移运算( >>> )
不带符号右移符号 >>> 用于整数二进制位右移运算,在移位操作过程中,右边移除(舍弃),左边的位补 0
例:将整数 A 进行不带符号右移 2 位运算:A >>> 2
2、按位运算
(1)& (按位与)
& 运算符用于两个整数的二进制按位与运算;在按位与操作过程中,如果对应的位都为 1 ,则该位的运算结果为 1,否则为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位与操作 A & B,则 A & B 的结果为 10
A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
1010~(2)~ (A & B)转换为十进制就是 10 ,按位与就是把它们的二进制对应的位进行与运算
(2)| (按位或)
| 运算符用于两个整数的二进制按位或运算;在按位或操作过程中,对应的位中只要有一个为 1 ,则该位的运算结果为 1;对应的位要同时为 0 该位的运算结果才为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位或操作 A | B,则 A | B 的结果为 11
A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
1011~(2)~(A | B)转换成十进制就是 11,按位或就是把它们的二进制对应的位进行或运算
(3)^ (按位异或)
^ 运算符用于两个整数的二进制按位异或运算,在按位异或操作过程中,如果对应位的值相异(一个为 0,一个为 1),则该位的运算结果位 1,否则,为 0
例:A = 10,B = 11,将整数 A 和 B 进行按位异或操作 A ^ B,则 A ^ B 的结果为 1
A = 10,10 转换成二进制是 1010
B = 11,11 转换成二进制是 1011
1010~(2)~ (A)
1011~(2)~ (B)
0001~(2)~ (A ^ B) 转换成十进制就是 1 ,按位异或就是把它们的二进制对应的位进行异或运算,不同为 1
(4)~ (按位取反)
~ 运算符,用于单个整数的二进制位按位取反操作(及将二进制位的 0 变 1,1 变 0 )
例:A = 10,将 A 进行按位取反操作:~A,而 ~A 的值为 3
A = 10,10 转换成二进制是 1010
1010~(2)~(A)
0101~(2)~ (~A) 转换为十进制就是 3,按位取反就是把它们的二进制对应的位取反,0 变 1,1 变 0
五、赋值运算符及表达式
注:在表格里面 |= 符号打不出来,所以我用 或= 表示
赋值运算符:
符号 | 说明 |
---|---|
= | 最常用的赋值符号 |
+= | A += B 类似于 A = A + B (运算时自身也要参与运算,将 A + B 的值赋予 A) |
-= | A -= B 类似于 A = A - B (将 A - B 的值赋予 A) |
*= | A = B 类似于 A = A B (将 A * B 的值赋予 A) |
/= | A /= B 类似于 A = A / B (将 A / B 的值赋予 A) |
%= | 下面这些运算符用法都类似上面的 |
&= | …… |
^= | …… |
或= | …… |
<<= | …… |
>>= | …… |
>>>= | …… |
六、三元运算符及表达式
三元运算符( ? : )也称条件运算符,由三元运算符组成的的条件表达式格式如下:
逻辑(关系)表达式 ? 表达式 1 :表达式 2
如果逻辑(关系)表达式的值为 true,则取表达式 1 的值;如果逻辑(关系)表达式的值为 false,则取表达式 2 的值
例:定义整型变量 a 和 b,并将它们赋值 a = 10,b = 20,求 a、b 中的最大值,并将最大值赋予变量 max。
public class Demo{
public static void main(String[] args){
int a = 10;
int b = 20;
int max = a > b ? a : b //表达式 a > b 成立,则取 a(表达式 1)的值,不成立则取 b(表达式 2)的值
System.out.println("最大值为" + max); //输出最大值为20,由于表达式不成立,所以最大值取表达式 2 的值,就是 b 的值
}
}
七、表达式的运算规则
1、Java 运算符的运算规则
注:在表格里面符号 | ,符号 || 打不出来,所以用 或 表示符号(|) 用 或或 表示符号(||)
Java 运算符的优先级:
…… | …… | …… |
---|---|---|
1 | . 、[] 、() | |
2 | new,(数据类型) | |
3 | * 、/、 % | 算术运算符 |
4 | +、- | …… |
5 | >>、>>>、<< | 位运算符 |
6 | >、<、>=、<=、instanceof | 关系运算符 |
7 | ==、!= | …… |
8 | & | 位运算符 |
9 | ^ | …… |
10 | 或 | …… |
11 | && | 逻辑运算符 |
12 | 或或 | …… |
13 | ?: | 三元运算符 |
14 | =、+=、-=、*=、/=、%=、^= | 拓展赋值运算符 |
15 | &=、或=、<<=、>>=、>>>= | …… |
2、类型转换
整型、实型、字符型数据可以混合运算。一般情况下,系统会默认将两个不同级别的中低级的运算数,转换为一致的更高级别的数据类型的运算数,然后再进行运算。
数据类型从高级到低级顺序如下:
==double > float > long > int > short > byte==
==int > char== 字符类型在和其他数据类型运算时会先根据 ASCII 码转换成 int 类型,然后参与运算。
要将高类型的数据类型转换成低类型的数据类型时,需要进行强制转化,而在转换过程中会造成数据溢出或者数据精度下降。
如果文章对各位小伙伴有帮助的话欢迎三连!!!
另外,文章如有错误之处,也欢迎各位大佬批评指正!!!