前言:
初学Java的你一定接触了运算符,什么算术运算符、逻辑运算符、逻辑运算符的,什么a++和++a的区别,以及短路与否的概念知识对于刚初学的你或许会比较绕吧,接下来跟着我一起动手整理一下这些运算符的区别吧~
如果有条件一定要动手试试每个运算符是怎么运行的,以及结果是怎样的~
一、算术运算符
基础:
+ | 加法求和 |
- | 减法求差 |
* | 乘法求积 |
/ | 除法求商 |
% | 求余数 |
注意:在Java中,整数使用以上运算符,无论怎么计算,也不会得到小数
举例:
进阶:
++ | 自增 |
-- | 自减 |
自增和自减运算符有两种不同的用法,分为将自增自减符号放在前面或者后面:
++ 自增 如果放在前面先自增再赋值,如果放在后面是先赋值再自增 -- 自减 如果放在前面先自减再赋值,如果放在后面是先赋值再自减
举例:
int a=3;
int b=++a;
//当++在前时会先自增1,再进行赋值运算,所以先是a自增1变成4,再将4的值赋给b
//所以此时a值为4,b值为4
int a=3;
int b=a++;
//当++再后时,会先进行n=m的赋值运算,再将m自增1,所以此时a值为4,b值为3
-- -- 运算符同++运算符规则,可以自己在电脑上试试~
二、赋值运算符
符号 | 作用 | 说明 |
= | 赋值 | a=10,将10赋值给变量a |
+= | 加后赋值 | a+=b,将a+b的值给a a=a+b |
-= | 减后赋值 | a-=b, 将a-b的值给a a=a-b |
*= | 乘后赋值 | a*=b,将a×b的值给a |
/= | 除后赋值 | a/=b,将a÷b的商给a a=a/b |
%= | 取余后赋值 | a%=b,将a÷b的余数给a a=a%b |
- 赋值运算符,就是将符号右边的值,赋给左边的变
public static void main(String[] args){
int i = 1;
i+=1;
// i=i+1 ==> 1+1 ==>2 i=2
System.out.println(i); //输出结果是2
}
- +=符号的扩展
下面的程序有问题吗?
public static void main(String[] args){
short s = 1;
s+=1;
System.out.println(s);
}
分析:
s += 1
逻辑上看作是s = s + 1
计算结果被提升为int类型,再向short类型赋值时发生错误,因为不能将取值范围大的类型赋值到取值范围小的类型。但是,s=s+1进行两次运算
,+=
是一个运算符,只运算一次,并带有强制转换的特点,也就是说s += 1
就是s = (short)(s + 1)
,因此程序没有问题编译通过,运行结果是2。因此,这里要说一点的是,赋值运算符默认进行了强制类型转换。
三、关系运算符
符号 | 说明 |
== | a==b,判断a和b的值是否相等,成立为true,不成立为false |
> | a>b,判断a是否大于b,成立为true,不成立为false |
>= | a>=b,判断a是否大于或者等于b,成立为true,不成立为false |
< | a<b,判断a是否小于b,成立为true,不成立为false |
<= | a<=b,判断a是否小于或者等于b,成立为true,不成立为false |
!= | a!=b,判断a和b的值是否不相等,成立为true,不成立为false |
- 关系运算符运算结果都是布尔值true或false,有两数据间比较决定
示例:
四、逻辑运算符
逻辑运算符把各个运算的关系表达式连接起来组成一个复杂的逻辑表达式,以判断程序中的表达式是否成立,判断 的结果是 true 或 false。 逻辑运算符分为以下六种:
符号 | 作用 | 说明 |
& | 逻辑与 | a&b,a和b都是true,结果为true,否则为false 并且关系 |
| | 逻辑或 | a|b,a和b都是false,结果为false,否则为true 或者关系 |
^ | 逻辑异或 | a^b,a和b结果不同为true,相同为false |
! | 逻辑非 | !a,结果和a的结果正好相反 |
&& | 短路与 | 1. 两边都是true,结果是true 2. 一边是false,结果是false 短路与特点:符号左边是false,右边不再运算 |
|| | 短路或 | 1. 两边都是false,结果是false 2. 一边是true,结果是true 短路或特点: 符号左边是true,右边不再运算 |
实例:
public static void main(String[] args) {
//定义变量
int i = 10;
int j = 20;
int k = 30;
//& “与”,并且的关系,只要表达式中有一个值为false,结果即为false
System.out.println((i > j) & (i > k)); //false & false,输出false
System.out.println((i < j) & (i > k)); //true & false,输出false
System.out.println((i > j) & (i < k)); //false & true,输出false
System.out.println((i < j) & (i < k)); //true & true,输出true
System.out.println("........");
//| “或”,或者的关系,只要表达式中有一个值为true,结果即为true
System.out.println((i > j) | (i > k)); //false | false,输出false
System.out.println((i < j) | (i > k)); //true | false,输出true
System.out.println((i > j) | (i < k)); //false | true,输出true
System.out.println((i < j) | (i < k)); //true | true,输出true
System.out.println("........");
//^ “异或”,相同为false,不同为true
System.out.println((i > j) ^ (i > k)); //false ^ false,输出false
System.out.println((i < j) ^ (i > k)); //true ^ false,输出true
System.out.println((i > j) ^ (i < k)); //false ^ true,输出true
System.out.println((i < j) ^ (i < k)); //true ^ true,输出false
System.out.println("........");
//! “非”,取反
System.out.println((i > j)); //false
System.out.println(!(i > j)); //!false,,输出true
}
逻辑运算符,是用来连接两个布尔类型结果的运算符,运算结果都是布尔值
true
或者
false
public static void main(String[] args) {
int x = 3;
int y = 4;
System.out.println((x++ > 4) & (y++ > 5)); // 两个表达都会运算
System.out.println(x); // 4
System.out.println(y); // 5
System.out.println((x++ > 4) && (y++ > 5)); // 左边结果为false,右边不参与运算
System.out.println(x); // 4
System.out.println(y); // 4
}
五.三元运算符
三元运算符表达式:
数据类型 变量名 = 布尔类型表达式?结果1:结果2
三元运算符计算方式:
- 布尔类型表达式结果是true,三元运算符整体结果为结果1,赋值给变量 。
- 布尔类型表达式结果是false,三元运算符整体结果为结果2,赋值给变量。
实例:
public static void main(String[] args) {
int a = 20;
int b = 10;
int max = (a>b ? a : b);//max赋值为 a,b中较大的值
System.out.println(max);//20
int min = (a<b ? a : b);//min赋值为 a,b中较小的值
System.out.println(min);//10
}
六.位运算符
位运算符指的是两个数之间的位运算,运算过程中都转换为字节类型参与运算。比如:数字3转换为字节数为0000 0011。
符号 | 作用 | 说明 |
& | 按位与 | 两数同位对比,有0则为0 |
| | 按位或 | 两数同位对比,有1则为1 |
^ | 按位异或 | 两数同位对比,不同为1,相同为0 |
~ | 按位取反 | 针对一个数,操作数的每一位都取反 |
<< | 按位左移 | 针对一个数,操作数的每位向左移动指定位数,最高位丢弃,尾部空位补0(相当于乘以2的n次方) |
>> | 按位右移 | 针对一个数,操作数的每位向右移动指定位数,头部空位补符号位数,移除部分丢弃 |
>>> | 无符号右移 | 针对一个数,操作数的每位向右移动指定位数,无论符号数头部都补0,移除部分丢弃 |
实例练习:
需求:有两个int类型变量a=10;b=20,要求使用多种方式实现这两个变量数值的交换。
代码段:
public static void main(String[] args) {
// 方法1:引入第三方变量进行互换(适用于整型/字符串型)
int temp = a;
a = b;
b = temp;
System.out.println(a + "和" + b);
// 方法2:求和再减
a = a + b;
b = a - b;
a = a - b
System.out.println(a + "和" + b);
// 使用位运算符
a = a ^ b;
b = a ^ b;
a = a ^ b;
System.out.println(a + "和" + b);
}