目录
运算符是用于执行操作的符号或关键字。表达式是由运算符和操作数(如变量、常量、方法调用等)组成的一组代码,用于计算并返回一个值。
1. 算术运算符
运算符 | 意义 |
---|---|
+(加法) | 对两个操作数进行加法运算。 |
-(减法) | 对两个操作数进行减法运算。 |
*(乘法) | 对两个操作数进行乘法运算。 |
/(除法) | 对两个操作数进行除法运算。 |
%(求余) | 返回除法运算的余数。 |
博主将会通过一些例子来引出算术运算符的使用注意事项。
这是关于只有整数的算术表达式:
public class AgrithDemo {
public static void main(String[] args) {
int a=12,b=13,c=4;
System.out.println("a+b的结果为:"+(a+b));//其中a+b就是一个表达式
System.out.println("a-b的结果为:"+(a-b));//涉及到字符串的加法,会在后面有介绍
System.out.println("b*c的结果为:"+(b*c));
System.out.println("b/c的结果为:"+(b/c));//这里的除法和日常所接触到的除法不同,因为b和c都是整型,所以结果为整型,不带有小数
System.out.println("b%c的结果为:"+(b%c));//这里的取余就是求得余数
}
}
结果为
但是当涉及浮点型时,结果会有所区别,接下来我们将整数b定义为浮点型b13.0。
public class AgrithDemo {
public static void main(String[] args) {
int a=12,c=4;
float b=13.0f;
System.out.println("a+b的结果为:"+(a+b));//
System.out.println("a-b的结果为:"+(a-b));//
System.out.println("b*c的结果为:"+(b*c));
System.out.println("b/c的结果为:"+(b/c));//
System.out.println("b%c的结果为:"+(b%c));//
}
}
由于每一个表达式都涉及浮点型数字b,所有结果都是浮点型,尤其除法变化最大,可以实现我们所接触到的数学中的除法。即只要有一个浮点数参与运算,最终结果就会是浮点型的。上述代码结果为:
2. 隐式转换和强制转换
隐式转换,也称为自动类型转换,这种转换通常发生在将一个较小范围的数据类型(整型或者浮点型或者字符)转换为较大范围的数据类型(整型或者浮点型)时。例如8bit的byte可以隐式转换为32bit的int型。而且这种转换不会导致数据中的某bit丢失,不会对数据大小造成改变。当整型转换为浮点型时即数据类型不一样时,数字虽然大小一样,但是会提高精度。
public class Translate {
public static void main(String[] args){
byte a=10;
int b;
float c;
b=a;
c=a;
System.out.println("a隐式转化为int型后的结果为:"+b);
System.out.println("a隐式转化为float型后的结果为:"+c);
}
}
int型结果还是10,但浮点型结果为10.0。
要牢记各数据类型大小关系:byte<<short<<int<<long<<float<<double,此外1.取值范围小的和取值范围大的进行运算,小的会提升为大的再进行运算;2. byte、short以及char三种类型的数据在运算的时候都会直接先提升为int,再进行运算。
强制转换,也称为显式类型转换,是将一个数据类型强制转换为另一个数据类型。这种转换通常在从较大范围的数据类型转换为较小范围的数据类型时进行,因为这可能会导致数据丢失或精度损失,因此需要显式地进行转换。例如int转byte,如果int所表示的数字超出byte的范围,就会造成数据丢失;float转int会造成精度丢失。
此外强制转换不能直接赋值,需要用到专门的格式:目标数据类型 变量名=(目标数据类型)被强制的数据。
public class Translate {
public static void main(String[] args){
int a=257;//0000 0000 0000 0000 0000 0001 0000 0001;
byte b=(byte)a;//0000 0001
float c=11.0f;
int d=(int)c;
System.out.println("a强制转化为byte型后的结果为:"+b);
System.out.println("c强制转化为int型后的结果为:"+d);//精度降低
}
}
结果为数据损失后的1和精度损失后的11:
3. 自增自减
自增为 数据名++或者++数据名,自减为 数据名--或者--数据名,都是加1或者减1。
但是先++和后++还是有不小区别的。
public class Demo {
public static void main(String[] args){
int a1=2,a2=2;
int b1,b2;
b1=a1++;
b2=++a2;
System.out.println("后++的结果为:"+b1);
System.out.println("先++的结果为:"+b2);
}
}
结果为:
因为b1所在的表达式中,先将a1赋值给b1再对a1进行自增,b2所在的表达式中先对a2进行自增再对b2进行赋值。同样的对于自减也适用。
4. 赋值运算符
赋值运算符是用于将值赋给变量的符号,分为基本赋值运算符(也就是=)和复合赋值运算符,和算术运算符息息相关。
本段重点讲解复合赋值运算符的使用:
符号 | 作用 | 说明 |
---|---|---|
+= | 加法赋值 | 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 |
示例如下:
public class Demo {
public static void main(String[] args){
int a=2,b=1;
System.out.println(a+=b);//计算前a=2,计算后a=3
System.out.println(a-=b);//计算前a=3,计算后a=2
System.out.println(a*=b);//计算前a=2,计算后a=2
System.out.println(a/=b);//计算前a=2,计算后a=2
System.out.println(a%=b);//计算前a=2,计算后a=0
}
}
结果为
此外赋值运算符隐含强制转换,不需要使用强制转换的格式。
5. 关系运算符
关系运算符用于比较两个值之间的关系,通常返回布尔值(真或假)。这些运算符在条件语句、循环和其他需要比较的场景中经常使用。
符号 | 说明 |
== (等于) | 检查两个值是否相等 |
!= (不等于) | 检查两个值是否不相等 |
> (大于) | 检查左边的值是否大于右边的值 |
< (小于) | 检查左边的值是否小于右边的值 |
>= (大于等于) | 检查左边的值是否大于或等于右边的值 |
<= (小于等于) | 检查左边的值是否大于或等于右边的值 |
示例如下:
public class Demo {
public static void main(String[] args){
System.out.println(2==3);
System.out.println(2!=3);
System.out.println(2>3);
System.out.println(2<3);
System.out.println(1>=3);
System.out.println(3<=3);
}
}
结果为:
此外不仅可以比较数字,也可以比较字符等。
6. 逻辑运算符
逻辑运算符用于组合或修改布尔表达式,通常用于控制程序流程和决策making。这些运算符处理布尔值(真/假)并返回布尔结果。
符号 | 作用 | 说明 |
---|---|---|
& | 逻辑与 | 当所有操作数都为真时返回真 |
| | 逻辑或 | 当至少一个操作数为真时返回真 |
^ | 逻辑异或 | 当操作数不同时返回真,相同时返回假 |
! | 逻辑非 | 反转操作数的布尔值 |
示例如下:
public class DemoNew {
public static void main(String[] args){
System.out.println("逻辑与的情况");
System.out.println(true & true);
System.out.println(true & false);
System.out.println(false & false);
System.out.println("逻辑或的情况");
System.out.println(true | true);
System.out.println(true | false);
System.out.println(false | false);
System.out.println("逻辑异或的情况");
System.out.println(true ^ true);
System.out.println(true ^ false);
System.out.println(false ^ false);
System.out.println("逻辑非的情况");
System.out.println(!true);
System.out.println(!false);
}
}
结果为:
7. 短路逻辑运算符
短路逻辑运算符是一种特殊的逻辑运算符,它在某些条件下会跳过("短路")部分表达式的求值。这种行为可以提高程序的效率,并且在某些情况下还能避免潜在的错误。
符号 | 作用 | 说明 |
---|---|---|
&& | 短路与 | 如果第一个操作数为假,整个表达式直接返回假,不再评估第二个操作数 |
|| | 短路或 | 如果第一个操作数为真,整个表达式直接返回真,不再评估第二个操作数 |
即
A && B
:只有当 A 为真时,才会评估 B
A || B
:只有当 A 为假时,才会评估 B
8. 三元运算符
三元表达式(也称为条件操作符或三目运算符)是一种简洁的条件语句,允许在一行代码中进行if-else决策。它是唯一一个需要三个操作数的操作符,因此得名"三元"。
格式:条件 ? 表达式1 : 表达式2
如果条件为真,返回表达式1的值;如果条件为假,返回表达式2的值。
例如找出两个数字中的最大值:
public class DemoNew {
public static void main(String[] args){
System.out.println("最大值为:"+(10>11?10:11));
}
}
结果为
这是由于10>11为false,返回表达式2的值,即11。此外当需要比较的数不值2个的时候,可以用多个三元运算符。
9. 移位运算符
移位运算符用于对二进制位进行左移或右移操作。这些操作可以非常高效地进行某些数学运算,尤其是在底层编程和优化中很有用。
符号 | 作用 | 说明 |
---|---|---|
<< | 左移 |
|
>> | 右移 |
|
>>> | 无符号右移 |
|
示例如下:
public class DemoNew {
public static void main(String[] args){
int a = 60; // 二进制:0011 1100
System.out.println(a << 2); // 240 (1111 0000)
System.out.println(a >> 2); // 15 (0000 1111)
System.out.println(a >>> 2); // 15 (0000 1111)
int b = -60; // 二进制:1100 0100 (补码表示)
System.out.println(b >> 2); // -15 (1111 0001)
System.out.println(b >>> 2); // 1073741809 (0011 0001)
}
}
结果为:
虽然a和b都不是有符号数字,但是a是正数,b是负数,无符号数字默认为正数,所以b无符号右移会出错。
10. 运算符的优先级
11. 字符和字符串的加法
字符相加中,都转化为int型进行相加,根据ASCII表可得,每个字符都对应着一个数值。
public class DemoNew {
public static void main(String[] args){
char a='A',b='B';
System.out.println(a+b);//a的值为65,b的值为66
}
}
结果如下:
字符串相加较为复杂,当操作符为+的表达式中出现字符串,这个+就不是算术运算符而是字符串连接符,会将前后的数据进行连接,形成一个新的字符串。此外,连续进行+操作时,从左到右依次执行。
public class DemoNew {
public static void main(String[] args){
System.out.println(123+"456");
System.out.println(1+2+"345");//1+2先进行
System.out.println("123"+4+5);//+一直起到连接符的作用
}
}
结果为: