java运算符
在Java语言中,使用+、-、*、/来表示加减乘除运算,当/运算的操作数都为整数时,表示整数的除法;否则则表示浮点除法。整数的取余操作,用%表示。
- 注意:整数被0除将会产生一个异常,而浮点数被0除则会得到无穷大或NaN。
一、类型转换
- 在我们日常的开发过程中,经常需要将一种数值类型转换为另外一种数值类型,下面给出数值类型之间的合法转换。
- 实心箭头表示无信息丢失转换。
- 虚线箭头表示可能有精度丢失的转换。
二、强制类型转换
在必要时,int类型的值将会自动转换为double类型。在有时候,我们也需要将double类型转换为int类型。在Java中,是允许进行这种类型间数值的转换的,当然,有可能会丢失一些信息。这种情况下,就要通过 强制类型转换(cast) 实现这个操作。
强制类型转换的语法格式是在圆括号中给出想要的目标类型,后面紧跟着要转换的变量名。
double num = 9.987;
int i = (int)num;
强制类型转换后,i 的值为9,并不是num的值9.987,这是因为强制类型转换通过截断小数部分,将浮点值转换为整型。
如果对浮点数进行四舍五入运算,以便得到最接近的整型,那就需要使用Math.round方法:
double num = 9.987;
int i = (int)Math.round(x);
此时 i 的值为10,调用round时,仍然需要使用强制类型转换,是因为round方法的返回值为long类型,由于存在精度丢失的可能性,只有使用显示的强制类型转换才能将long转换成int类型。
三、结合赋值与运算符
在我们日常的开发中,可以在赋值中使用二元运算法,以达到简写代码的目的。
result += 1;
result = result +1;
上述两个表达式含义相同。
- 一般的,要把运算符放在 = 号左边,如:+=、-=、*=、%= 等。
四、自增与自减
在日常开发中,加1、减1是数值变量的最常见的操作,在java中,也有同c、c++一样,提供了自增和自减运算符。
int n = 1;
n++; // 将变量n的当前值+1
n--; // 将变量n的当前值-1
由于这些运算符会改变变量的值,所以他们的操作数不能是数值。
- 自增和自减运算符有两种形式
- 后缀自增自减法(n++、n–) : 先赋值,再进行自增、自减。
- 前缀自增自减法(++n、–n) : 先自增、自减,再进行赋值。
int i = 7;
int j = 7;
int a = 2 * ++i; // a = 16, i = 8
int b = 2 * j++; // b = 14, j = 8
建议不要在表达式中使用 ++ ,因为这样的代码很容易让人困惑,而且可能会带来bug。
五、逻辑运算符
下表列出了逻辑运算符的基本运算,假设布尔变量A为真,变量B为假
操作符 | 描述 | 示例 |
---|---|---|
&& | 称为逻辑与运算符。当且仅当两个操作数都为真,条件才为真。 | (A && B)为假。 |
|| | 称为逻辑或操作符。如果任何两个操作数任何一个为真,条件为真。 | (A | | B)为真。 |
! | 称为逻辑非运算符。用来反转操作数的逻辑状态。如果条件为true,则逻辑非运算符将得到false。 | !(A && B)为真。 |
public class Test {
public static void main(String[] args) {
boolean a = true;
boolean b = false;
System.out.println("a && b = " + (a&&b)); // false
System.out.println("a || b = " + (a||b) ); // true
System.out.println("!(a && b) = " + !(a && b)); // true
}
}
- 短路逻辑运算符
当使用与逻辑运算符时,在两个操作数都为true时,结果才为true,但是当得到第一个操作为false时,其结果就必定是false,这时候就不会再判断第二个操作了。
public class LuoJi{
public static void main(String[] args){
int a = 5;//定义一个变量;
boolean b = (a<4)&&(a++<10);
System.out.println("使用短路逻辑运算符的结果为"+b);
System.out.println("a的结果为"+a);
}
}
六、位运算符
Java定义了位运算符,应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型。
位运算符作用在所有的位上,并且按位运算。假设a = 60,b = 13;它们的二进制格式表示将如下:
A = 0011 1100
B = 0000 1101
-----------------
A & B = 0000 1100 // 全为1则为1
A | B = 0011 1101 // 其中一个为1则为1
A ^ B = 0011 0001 // 两者不同则为1
~ A = 1100 0011 // 为0则为1,为1则为0
下表列出了位运算符的基本运算,假设整数变量 A 的值为 60 和变量 B 的值为 13:
操作符 | 描述 | 示例 |
---|---|---|
& | 如果相对应位都是1,则结果为1,否则为0 | (A&B),得到12,即0000 1100 |
| | 如果相对应位都是 0,则结果为 0,否则为 1 | (A | B)得到61,即 0011 1101 |
^ | 如果相对应位值相同,则结果为0,否则为1 | (A ^ B)得到49,即 0011 0001 |
~ | 按位取反运算符翻转操作数的每一位,即0变成1,1变成0。 | (〜A)得到-61,即1100 0011 |
<< | 按位左移运算符。左操作数按位左移右操作数指定的位数。 | A << 2得到240,即 1111 0000 |
>> | 按位右移运算符。左操作数按位右移右操作数指定的位数。 | A >> 2得到15即 1111 |
>>> | 按位右移补零操作符。左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。 | A>>>2得到15即0000 1111 |
public class Test {
public static void main(String[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
System.out.println("a & b = " + c );
c = a | b; /* 61 = 0011 1101 */
System.out.println("a | b = " + c );
c = a ^ b; /* 49 = 0011 0001 */
System.out.println("a ^ b = " + c );
c = ~a; /*-61 = 1100 0011 */
System.out.println("~a = " + c );
c = a << 2; /* 240 = 1111 0000 */
System.out.println("a << 2 = " + c );
c = a >> 2; /* 15 = 1111 */
System.out.println("a >> 2 = " + c );
c = a >>> 2; /* 15 = 0000 1111 */
System.out.println("a >>> 2 = " + c );
}
}
七、运算符级别
当多个运算符出现在一个表达式中,谁先谁后呢?这就涉及到运算符的优先级别的问题。在一个多运算符的表达式中,运算符优先级不同会导致最后得出的结果差别甚大。
- 下表中具有最高优先级的运算符在的表的最上面,最低优先级的在表的底部。
类别 | 操作符 | 关联性 |
---|---|---|
后缀 | () [] . (点操作符) | 左到右 |
一元 | expr++ expr– | 从左到右 |
一元 | ++expr --expr + - ~ ! | 从右到左 |
乘性 | * /% | 左到右 |
加性 | + - | 左到右 |
移位 | >> >>> << | 左到右 |
关系 | > >= < <= | 左到右 |
相等 | == != | 左到右 |
按位与 | & | 左到右 |
按位异或 | ^ | 左到右 |
按位或 | | | 左到右 |
逻辑与 | && | 左到右 |
逻辑或 | || | 左到右 |
条件 | ?: | 从右到左 |
赋值 | = + = - = * = / =%= >> = << =&= ^ = | = | 从右到左 |
逗号 | , | 左到右 |