文章目录
一、含义
数学因有运算而变得无所不能,而编程本质上就是一种数学,运算也必不可少。运算符是表示运算的符号,按参加运算的数的个数分有一/二/三元(目)运算符;按其含义可分为算术运算符、赋值运算符、关系运算符、逻辑运算符、位运算符以及条件运算符。
二、分类
1. 算术运算符
算术运算符 | 名称 | 描述 | 运算个数 | 举例 |
---|---|---|---|---|
+ | 加法 | 相加运算符两侧的值 | 2 | a + b |
- | 减法 | 左操作数减去右操作数 | 2 | a - b |
* | 乘法 | 相乘操作符两侧的值 | 2 | a * b |
/ | 除法 | 左操作数除以右操作数 | 2 | a / b |
% | 取余 | 左操作数除右操作数的余数 | 2 | a % b |
++ | 自增 | 操作数的值增加 1 | 1 | ++i(或 i++) |
- - | 自减 | 操作数的值减少 1 | 1 | - -i(或 i- -) |
注意:
- ++/- -的位置不同,表示的含义也不同。在前表示先计算后赋值,在后表示先赋值后计算。
//自增1++、自减1--
//++/--在前先运算后赋值;在后先赋值后运算
int a = 10;
System.out.println(a++);//输出10
//此时a=11
System.out.println(++a);//输出12
System.out.println(a);//输出12
System.out.println(a--);//输出12
//此时a=11
System.out.println(--a);//输出10
System.out.println(a);//输出10
- 注意除法运算的特殊性,两个整数相除结果不一定为整数,使用除法时,必须有浮点数数据格式(float/double)。
int a = 10;
int b = 15;
double v = a;
//注意除法运算的特殊性,两个整数相除结果不一定为整数
//使用除法时,必须有浮点数数据格式(float/double)
System.out.println(a/b);//输出0
System.out.println(v/b);//输出0.666..
System.out.println((double)a/b);//输出0.666..
System.out.println(Double.valueOf(a)/b);//输出0.666..
- 当几个不同数据格式的变量参与运算时,若有高级别的变量(int/long/float/double),则结果为最高级别数据格式,否则为默认数据格式(int/double)。
long a = 10;
int b = 10;
short c = 10;
byte d = 10;
float e = 10;
System.out.println(a+b+c+d);//long
System.out.println(b+c+d);//int
System.out.println(c+d);//int
System.out.println(a+e);//float
2. 赋值运算符
赋值运算符 | 名称 | 描述 | 运算个数 | 举例 |
---|---|---|---|---|
= | 被赋予 | 等号右边的值赋予左边变量 | 2 | a=1 |
+= | 自增 | 将变量加上一个值作为变量新值 | 2 | a+=2(同a=a+2) |
-= | 自减 | 将变量减去一个值作为变量新值 | 2 | a-=2(同a=a-2) |
*= | 自乘 | 将变量加上一个值作为变量新值 | 2 | a*=2(同a=a*2) |
/= | 自除 | 将变量加上一个值作为变量新值 | 2 | a/=2(同a=a/2) |
3. 关系运算符(返回True/False)
关系运算符 | 名称 | 描述 | 运算个数 | 举例 |
---|---|---|---|---|
== | 等于 | 判断左值是否等于右值 | 2 | a==b |
!= | 不等于 | 判断左值是否与右值不相等 | 2 | a!=b |
>[=] | 大于[等于] | 判断左值是否大于(等于)右值 | 2 | a>[=]b |
<[=] | 小于[等于] | 判断左值是否小于(等于)右值 | 2 | a<[=]b |
4. 逻辑运算符(返回True/False)
逻辑运算符 | 名称 | 描述 | 运算个数 | 举例 |
---|---|---|---|---|
&& | 并且 | 当两个条件同为真时,返回真,否则返回假 | 2 | (1>2)&&(2>1) |
|| | 或者 | 当两个条件同为假时,返回假,否则返回真 | 2 | (1>2)||(2>1) |
! | 非 | 当条件为真时返回假,为假时返回真 | 1 | !(1>2) |
注意:
- 关系运算符用于连接两个数,而逻辑运算符用来连接两个条件(Boolean值)。
- 条件判断采用短路原则:当只需判断第一个条件的真假便可得到整个逻辑运算的真假时,无需判断执行后续条件,如一个假并一个条件必为假,一个真或一个条件必为真。
//短路运算,&&执行到第一个false条件,||执行到第一个true条件
int c = 5;
boolean d = (c<4)&&(c++<4);
boolean e = (c>4)||(c++<4);
//当判断第一个条件c<4为false后,不需判断(c++<4),c值不变
//当判断第一个条件c>4为true后,不需判断(c++<4),c值不变
System.out.println(c);
5. 位运算符(二进制)
以10(0000 1010)和15(0000 1111)举例说明。
位运算符 | 名称 | 描述 | 运算个数 | 举例 |
---|---|---|---|---|
& | 并 | 当两个字位均为1时,返回1,否则返回0 | 2 | 10&15=00001010=10 |
| | 或 | 当两个字位均为0时,返回0,否则返回1 | 2 | 10|15=00001111=15 |
^ | 异或 | 当两个字位值不同返回1,相同时返回0 | 2 | 10^15=00000101=5 |
~ | 非 | 字位为1的变为0,为0的变为1 | 2 | ~10=11110101=-11 |
<< | 左移 | 将所有字位值向左移动 | 2 | 10<<2=00101000=40 |
>> | 右移 | 将所有字位值向右移动 | 2 | 10>>2=00000101=5 |
注意:
- 位运算由于是直接操作适合机器执行的二进制数,故其效率非常高,可通过使用位运算来优化代码。
- 不同位运算有不同作用,需要自己探索,如左移/右移一位相当于乘/除2。
6. 条件运算符
条件运算符只有一种,即 ? :
,同时也是唯一的三元运算符。它本质上是if-else语句的缩写,其语法格式为:
判断条件 ? 为真时返回值 : 为假时返回值
如 (3>4) ? 1 : 2
返回 2
7. 其他运算方法
使用Math类的方法,如pow()、abs()、max()、min()、sin()等。
//注意Math类里的pow方法返回的是一个double值
double a = Math.pow(2,3);
System.out.println(a);//输出8
三、运算优先级(了解)
在实际编程中,不需要去记忆运算符的优先级别,也不要刻意的使用运算符的优先级别,对于不清楚优先级的地方使用小括号去进行替代,直观易读。下面是java运算符优先级表,以供参考。
说明一下,结合性表示当有多个同等级运算符时,是从左往右计算(左结合),还是从有往左计算(右结合)。如1+2+3就是 (1+2)+3,a+=b*=3就是a+=(b*=3)即a+=3*b(如果按左结合的方式计算,则a=3*(a+b))
int a = 2;
int b = 3;
int c;
System.out.println(a+=b*=3);//11
a = 2;b =3;//初始化
c = a+=b;
c *= 3;
System.out.println(c);//15