2021-01-15

4 篇文章 0 订阅
3 篇文章 0 订阅
本文详细介绍了Java中的算术运算符,包括加减乘除、自增自减及其规则。还讨论了赋值运算符、比较运算符以及位运算符,如按位与、按位或、按位异或和位移。通过实例展示了这些运算符的使用,并提到了类型转换和位运算中的细节。此外,还提及了逻辑运算符的相关知识。
摘要由CSDN通过智能技术生成

Java运算符

内容简介:算术运算符、赋值运算符、比较运算符、位运算符、类似相关运算符

1、算术运算符

  • +
double a = 1.2;
double b = 2.3;
double sum = a + b;
//sum的值为3.5

除此之外,+号还可以作为字符串的连接运算符。

  • -
double a = 3.2;
double b = 2.1;
double sub = a - b;
//sub的值为1.1
  • *
double a = 3.3;
double b = 2.4'
double mul = a * b;
//mul的值为7.92
  • / 除法运算符有些特殊,有两种情况。如果除法运算符的两个操作数都是整数型,则计算结果也为整数,就是自动将余数去掉,且当除法运算两个数都为整数类型时除数不可以为0;如果两个操作数其中任意一个为浮点类型,那这个运算结果就是我们平常计算的结果,且此时允许除数是0或者0.0,得到的结果是正无穷大或负无穷大。如下程序所示:
double a =4.3;
double b =3.5;
double div a / b;
//div的值将为1.228571428571428
div = 4 / 0.0;
//div的值为:Infinity
div = -4.0 / 0;
//div的值为:-Infinity
div = 4 / 0;
//系统将会出现异常
  • % 求余运算需要进行除法运算,因此也分为两种情况。如果求余运算的两个操作数都是整数,则求余运算的第二个操作数不能是0,否则会引发除0异常;如果求余运算的两个操作数中有一个或者两个都是浮点数,则允许第二个操作数是0或者0.0,只是求余运算的结果是非数:NaN。0或0.0对零以外的任意数求余数都将得到0或0.0。如下程序所示:
double a = 4.3;
double b = 3.5;
double mod = a % b;
//mod的值为0.8
mod = 4 % 0.0;
//mod的值为非数:NaN
mod = -4.0 % 0;
//mod的值为非数:NaN
mod = 0 % 0.0;
//mod的值为非数NaN
mod = -4 % 0;
//程序出现异常

++ ①自加是单目运算符,只能操作一个操作数;②自加运算符只能操作单个数值型(整型、浮点型)的变量,不能操作常量或者表达式。运算符即可以出现在操作数的左边也可以出现在操作数右边,出现在左右两边效果不一样。如果把++放在左边表示先把操作数加1然后才把操作数放入表达式中计算;如果把++放在右边,则先把操作数放入表达式中运算后再把操作数加1。下面我们来描述这个过程:

//++在前
int a = 1;
int b = a++;

++在前的情况
①:执行 int a = 1;在在内存空间里开辟一个int类型命名为a的变量空间并从常量池中取常量1存储到a中;
②:执行 b = ++a;由于++在变量前计算机需要先把a存储的值加1;
③:a中值加1后,紧接着计算机会把a复制一个副本a~;
④:在栈内存空间开辟一个int类型命名为b的变量空间并把a的副本a~ 的值2赋值给b;
⑤:此时b = ++a;运行结束a的副本a~被销毁;
运行结束以后 a = 2; b = 2;

//++在后
int a = 1;
int b = ++a;

在这里插入图片描述
①:执行 int a = 1在内存空间里开辟一个int类型命名为a的变量空间并从常量池中取常量1存储到a中;
②:执行 b = a++由于++在变量后计算机会先把a复制一个副本a~;
③:a中值加1后,紧接着计算机把a存储的值加1;
④:在栈内存空间开辟一个int类型命名为b的变量空间并把a的副本a~的值1赋值给b;
⑤:此时b = a++运行结束a的副本a~被销毁;

  • 拓展
int m = 1;
int n = 2;
int sum = m++ + ++n - n-- - --m + n-- - --m;
//        1   +   3 - 3   -   1 + 2   -   0
//sum = 2;n = 1;m = 0
/*
提示:
①这个式子中++和--的优先级最高;
②在处理++或--时计算机是用变量的副本进行整个式子的运算;
例如:第一个m++ m的值变成2,但m的副本m~的值为1,是副本1参与整个式子的运算,
对于第一个--m,由于刚刚m已经变成了2,自身先减1再复制,
此时m的值为1,副本的值也为1,副本参与整个式子的运算
*/

+=a(常量):表示把一个变量的值加常量a

int x = 1;
x += 4;
//表示a的值加4此时a的值为5

//补充
byte a = 1;
a += 2;
/*
a的二进制存储为:                        00000001
2的二进制为:00000000 00000000 00000000 00000010
a的值和2相加后值为3
a +=2 表示把int类型的3赋值到a中 等价于 int byte = 3
因为3没有超出byte的存储范围,计算机会只动的把int类型的3转化为byte类型的3存储到a中。
*/
byte a =1;
a = (byte)(a + 2);
/*
这里必须要强制类型转化,不然系统会出现异常。
因为a为byte类型变量,等号右边(a+2)这个整体是int类型变量,
把大空间存储值存储到小空间中必须要进行强制类型转换。
*/

乘方、开方 :则可借助java.lang.Math类的工具方法完成复杂的数学运算,代码如下:

double a = 3.2;//定义变量a为3.2
//求a的4次方并将计算结果赋值给b
double b = Math.pow(a,4);
//求a的平方根并将结果赋值给c
double c = Math.sqrt(a);
//计算随机数,返回一个0~1之间的伪随机数
double d =Math.random();
//求1.3的sin函数值
double e = Math.sin(1.3);

Math类下包含了丰富的静态方法,用于完成各种复杂的数学运算。

2、赋值运算符
赋值运算将一个直接量赋值给变量、将一个变量的值赋值给另一个变量、将表达式的值赋值给变量。

//直接量赋值给变量
String x = "Java";
boolean visited = true;
//将一个变量的值赋值给另一个变量
String str2 = str;
//将表达式的值赋值给变量
double b = a + 4;

3、位运算符

  • &:按位与。当两位同时为1时才返回1.
System.out.println(5 & 9);
/*
5:00000000 00000000 00000000 00000101
7:00000000 00000000 00000000 00001001
  00000000 00000000 00000000 00000001 ->1
*/
  • | :按位取或。只要有一位为1即可返回1。
System.out.println(5 | 9);
/*
5:00000000 00000000 00000000 00000101
7:00000000 00000000 00000000 00001001
  00000000 00000000 00000000 00001101 ->13
*/

~ :按位非。单目运算符,将操作数的每一位(包括符号位)全部取反。

System.out.println(~-5);
/*
-5的源码:10000000 00000000 00000000 00000101
-5的反码:11111111 11111111 11111111 11111010
-5的补码:11111111 11111111 11111111 11111011
按位取反:00000000 00000000 00000000 00000100 ->4
*/ 

^ :按位异或。当两位相同时返回0,不同时返回1。

System.out.println(5 ^ 9);
/*
5:00000000 00000000 00000000 00000101
7:00000000 00000000 00000000 00001001
  00000000 00000000 00000000 00001100 ->12
*/

<< : 左移运算符。把二进制补码向左移动空出的位置补充0

System.out.prinrln(-5<<2);
/*
-5的补码:11111111 11111111 11111111 11111011
 ~移动后:11111111 11111111 11111111 11101100 ->-20
*/

>>> :无符号右移运算符。把二进制补码向右移动空出的位置补充0

System.out.prinrln(-5>>>2);
/*
-5的补码:11111111 11111111 11111111 11111011
 ~移动后:00111111 11111111 11111111 11111110 ->10737741822
*/

>> :有符号左运算符。如果操作数为负数移动后空出来的位置补充1,如果操作数为正数移动后空出来的位置用0补充。

System.out.prinrln(-5>>2);
/*
-5的补码:11111111 11111111 11111111 11111011
 ~移动后:11111111 11111111 11111111 11111110 ->-2
*/

*补充:
①:对于低于int类型(byte、short和char)的操作数总是先自动转化为int类型后再移位
②:对于int类型的整数位移a>>b,当b>32时,系统先用b对32求余(因为int类型只有32位),得到的结果才是真正的位移数。例如a>>33等价于a>>1。
③:对于long的整数位移a>>b,当b>64时,总是先用b对64取余(因为long类型是64位)得到的结果才是真正的位移数。

4、比较运算符 >、>=、<、<=、==、!=

5、逻辑运算符

用于操作两个布尔型的变量或常量,逻辑运算有下面6种:
&&、&、||、|、!、^;

运算符大致总结到这里 。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值