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种:
&&、&、||、|、!、^;
运算符大致总结到这里 。