运算符是一些特殊的符号,主要用于数学函数,一些类型的赋值语句和逻辑比较方面。
一.赋值运算符
赋值运算符以符号“=”表示,它是一个二元运算符,其功能是将又方的操作数所含的值赋给左方的操作数。例如:
int a = 100;
该表达式是讲100赋值给变量a。左方操作数必须是一个变量,而右边的操作数则可以是任何表达式,包括变量(如a、number)、常量(如123,、‘book’)、有效表达式(如45*54)。
由于赋值运算符“=”处理时会先取得右方表达式处理后的结果,因此若一个表达式含有两个以上的“=”运算符,会从最右方的“=”开始处理。
public class Main{
public static void main(String[] args) {
int a,b,c; //声明int变量a,b,c
a=19; //将19赋值给a
c=b=a+2; //将a与2的和赋值给b,再赋值给c
System.out.println("c值为:"+c); //输出变量c的值
System.out.println("b值为:"+b); //输出变量b的值
}
}
运行结果如下:
c的值为:21
b的值为:21
二.算术运算符
Java中的算数运算符主要有+、-、*、/(除)、%(求余),它们都是二元运算符。
运算符 | 说明 | 实例 | 结果 |
---|---|---|---|
+ | 加 | 12.45f+15 | 27.45 |
- | 减 | 4.56-0.16 | 4.4 |
* | 乘 | 5L*12.45f | 62.25 |
/ | 除 | 7/2 | 3 |
% | 求余 | 12%10 | 2 |
在进行除法运算时,0不能做除数。比如“int a=5/0;”,系统会报错。
来个代码练练手:
public class Main {
public static void main(String[] args){
int a = 9;
int b = 20;
int c = 30;
int d = 40;
System.out.println(a+b);
System.out.println(a-b);
System.out.println(c*d);
System.out.println(c/a);
System.out.println(c%a);
}
}
运行结果如图:
三.自增自减运算符
自增、自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后。操作元必须是一个整型或浮点型变量。自增、自减运算符的作用是使变量的值增1或减1。放在操作元前面的自增、自减运算符,会先将变量的值加1(减1),然后使该变量参与表达式的运算。放在操作元后面的自增、自减运算符,会先使变量参与表达式的运算,然后将该变量加1(减1)。例如:
++a //表示在使用变量a之前,先将a的值加1
a++ //表示在使用变量a之后,将a的值加1
粗略地分析,“++a”与“a++”的作用都相当于a=a+1.假设a=4,则:
b = ++a; //先将a的值加1,然后赋给b,此时a值为5,b值为5
再看另一个语法,同样假设a=4,则
b = ++a; //先将a的值赋给b,再将a的值变成5,此时a值为5,b值为4
四.比较运算符
比较运算符属于二元运算符,用程序中的变量之间、变量和自变量之间以及其他类型的信息之间的比较。比较运算符的结果是boolean型。当运算符对应的关系成立时,运算结果为true,否则为false。
比较运算符有>、<、>=、<=、==、!=。
五.逻辑运算符
逻辑运算符包括&&(与)、||(或)、!(非)。逻辑运算符的操作单元必须是boolean型数据。
运算符 | 含义 | 用法 | 结合方向 |
---|---|---|---|
&& | 与(一假则为假) | a&&b | 从左到右 |
|| | 或(一真则为真) | a||b | 从左到右 |
! | 非(非真既假) | !a | 从右到左 |
使用逻辑运算符“&”会判断两个表达式;而逻辑运算符“&&”则是针对boolean类型的类进行判断的,当第一个表达式为false时则不会去判断第二个表达式,直接出结果,从而节省计算机的判断次数。通常将这种在逻辑表达式中从左端的表达式可退出整个表达式的值的情况称为“短路”,而那些始终要执行逻辑运算符两边的表达式才能推断出整个表达式的值的情况称为“非短路”。“&&”属于“短路”运算符,而“&”属于“非短路”运算符。
上代码:
public class Main {
public static void main(String[] args) {
int boys = 15; //男生人数
int girls = 17; //女生人数
int totle = boys + girls; //总人数
boolean result1 =((boys > girls)&&(totle > 30)); //男生人数多余女生,且总人数大于30
boolean result2 =((boys > girls)||(totle > 30)); //男生人数多余女生,或总人数大于30
System.out.println("男生人数大于女生人数并且总人数大于30人:" + result1); //输出结果
System.out.println("男生人数大于女生人数并或者人数大于30人:" + result2);
}
}
运行结果如下:
六.位运算符
位运算符除了“按位与”和“按位或”运算之外,其他只能用于处理整数的操作数,包括byte、short、char、int和long等数据类型。位运算是完全针对位方面的操作。
1.“按位与”运算
“按位与”运算的运算符为“&”,为双目运算符。“按位与”运算的运算法则是:如果两个证型数据a、b对应的位都是1,则结果位才是1,否则为0。
2.“按位或”运算
- “按位或”运算的运算符为“|”,为双目运算符。“按位或”运算的运算法则是:如果两个操作数的对应位都是0,则结果位才是0,否则为1。
3.“按位取反”运算
“按位取反”运算也成“按位非”运算,运算符为“~”,为单目运算符。“按位取反”就是将操作数二进制中的1修改为0,0修改为1。
4.“按位异或”运算
“按位异或”运算的运算符是“^”,为双目运算符。“按位异或”运算的运算法则是:当两个操作数的二进制表示相同(同时为0或为1)时,结果为0,否则为1。
5.移位操作
除了上述运算符,还可以数据按二进制位进行移位操作。Java中的移位运算符有以下三种:
- <<:左移。
- >>:右移。
- >>>:无符号右移。
左移就是将运算符左边的操作数的二进制数据,按照运算符右边的操作数指定的位数向左移动,右边移空的部分补0。右移则复杂一些。当使用“>>”符号时,如果最高位是0,右移的空位就填入0;如果最高位是1,右移的空位就填入1。
Java还提供了无符号右移“>>>”,无论最高位是0还是1,左侧被移空的高位都填入0。
移位可以实现整数除以或乘以
的效果,例如,y<<2与y*4结果相同,y>>1的结果与y/2的结果相同。总之,一个数左移n位,就是将这个数乘以
;一个数左移n位,就是将这个数除以
。
七.复合赋值运算符
所谓复合赋值运算符,就是将赋值运算符和其他运算符合并成一个运算符来使用,从而同时实现两种运算符的效果。
运算符 | 含义 | 举例 | 等价效果 |
+= | 相加结果富裕左侧 | a+=b; | a=a+b; |
-= | 相减结果富裕左侧 | a-=b; | a=a-b; |
*= | 相乘结果富裕左侧 | a*=b; | a=a*b; |
/= | 相除结果富裕左侧 | a/=b; | a=a/b; |
%= | 取余结果赋予左侧 | a%b; | a=a%b; |
&= | 与结果赋予左侧 | a&=b; | a=a&b; |
|= | 或结果赋予左侧 | a|=b; | a=a|b; |
^= | 异或结果赋予左侧 | a^=b; | a=a^b; |
<<= | 左移结果赋予左侧 | a<<=b; | a=a<<b; |
>>= | 右移结果赋予左侧 | a>>=b; | a=a>>b; |
>>>= | 无符号右移结果赋予左侧 | a>>>=b; | a=a>>>b; |
以“+=”为例,虽然“a=a+1”与“a+=1”二者的最后计算结果是相同的,但是在不同场景下,两种运算符都有各自的优势和劣势:
在Java编译环境中,整数的默认类型是int型,因此下面的赋值语句会报错:
byte a = 1; //创建byte型变量a
a = a + 1; //让a的值+1,错误提示:无法将int型转换成byte型
在没有进行强制转换的条件下,a+1的结果是一个int值,无法直接赋给一个byte变量。但如果使用“+=”实现递增计算,就不会出现这个问题。
byte a = 1; //创建byte型变量a
a += 1; //让a的值+1
八.三元运算符
三元运算符的使用格式如下:
条件式?值1:值2
//如果 条件式==true,则结果为值1,否则结果为值2
三元运算符等价于if……else语句,例如:
boolean a; //声明boolean变量
if(20<30) //将20<30作为判断条件
a = true; //条件成立,将true赋值给a
else
a = false; //条件不成立,将false赋值给a
九.运算符的优先级
Java中的表达式就是使用运算符连接起来的符合Java规则的式子。运算符的优先级决定了表达式中运算执行的先后顺序。通常,优先级由高到低的顺序依次是:
- 增量和减量运算
- 算术运算
- 比较运算
- 逻辑运算
- 赋值运算
如果两个运算有相同的优先级,那么左边的表达式要比右边的表达式先被处理。下面是Java中众多运算符特定的优先级:
优先级 | 描述 | 运算符 | 优先级 | 描述 | 运算符 |
---|---|---|---|---|---|
1 | 圆括号 | () | 9 | 按位与运算 | & |
2 | 正负号 | +、- | 10 | 按位异或运算 | ^ |
3 | 一元运算符 | ++、--、! | 11 | 按位或运算 | | |
4 | 乘除 | *、/、% | 12 | 逻辑与运算 | && |
5 | 加减 | +、- | 13 | 逻辑或运算 | || |
6 | 移位运算 | >>、>>>、<< | 14 | 三元运算符 | ?: |
7 | 比较大小 | >、<、>=、<= | 15 | 赋值运算符 | = |
8 | 比较是否相等 | ==、!= |
在编写程序时尽量使用圆括号来指定运算次序,以免产生错误的运算顺序。