详解Java中运算符及用法
在前面的内容已经学会了如何定义变量和初始化变量。定义变量的目的就是为了操作数据。Java语言中给我们提供了专门用来操作这些数据的代码符号,统称为“运算符”。
按照操作符的用法,我们可以分为以下几类:
算术运算符
赋值运算符
自增和自减运算符
逻辑运算符
关系运算符
位运算符
不用担心,它们就是些符号而已,帮我们处理操作数据的。下面用代码实例,一一来说明这些运算符的用法。
1.算术运算符
算术运算符,就是针对数值变量的加、减、乘、除、取余的算术操作:
加:+
减:-
乘:*
除:/
取余:%
publicclassOperatorsDemo{ publicstaticvoidmain(String[]args){ intnum1=100; intnum2=20; //加 System.out.println("num1+num2:"+(num1+num2)); //减 System.out.println("num1-num2:"+(num1-num2)); //乘 System.out.println("num1*num2:"+(num1*num2)); //除 System.out.println("num1/num2:"+(num1/num2)); //取余 System.out.println("num1%num2:"+(num1%num2)); } }
输出结果:
num1+num2:120 num1-num2:80 num1*num2:2000 num1/num2:5 num1%num2:0
2.赋值运算符
与大部分编程语言相同,Java使用'='运算符来进行赋值操作。这种操作会将右边的计算结果(称为右值)赋给左边的变量。Java中赋值运算符有:
=(num2=num1)
+=(num2+=num1等价num2=num2+num1)
-=(num2-=num1等价num2=num2-num1)
*=(num2*=num1等价num2=num2*num1)
/=(num2/=num1等价num2=num2/num1)
%=(num2%=num1等价num2=num2%num1)
publicclassOperatorsDemo{ publicstaticvoidmain(String[]args){ intnum1=10; intnum2=20; num2=num1; System.out.println("=Output:"+num2); num2+=num1; System.out.println("+=Output:"+num2); num2-=num1; System.out.println("-=Output:"+num2); num2*=num1; System.out.println("*=Output:"+num2); num2/=num1; System.out.println("/=Output:"+num2); num2%=num1; System.out.println("%=Output:"+num2); } }
结果输出:
=Output:10 +=Output:20 -=Output:10 *=Output:100 /=Output:10 %=Output:0
3.自增和自减运算符
自增和自减运算符,只操作一个变量,是变量的值发生改变。
num++(等价num=num+1)自增,主要针对数值变量,使自身变量的值加1。
num—(等价num=num-1)自减,主要针对数值变量,使身变量的值减去1。
publicclassOperatorsDemo{ publicstaticvoidmain(String[]args){ intnum1=100; intnum2=200; num1++; num2--; System.out.println("num1++is:"+num1); System.out.println("num2--is:"+num2); } }
结果输出:
num1++is:101 num2--is:199
4.逻辑运算符
逻辑运算符,顾名思义用于逻辑判断,运算的结果为boolean类型的值,即true或者false。逻辑匀运算符有
逻辑运算符 | 逻辑关系 |
---|---|
&& | 与 |
` | |
! | 非 |
b1&&b2:如果b1和b2都为真,b1&&b2将返回true,否则返回false
b1||b2:如果b1和b2都是假,将返回false,否则返回true。
!b1:将返回与b1相反的值,如果b1为false,则返回true;如果b1为true,则返回false
publicclassOperatorsDemo{ publicstaticvoidmain(String[]args){ booleanb1=true; booleanb2=false; System.out.println("b1&&b2:"+(b1&&b2)); System.out.println("b1||b2:"+(b1||b2)); System.out.println("!(b1&&b2):"+!(b1&&b2)); } }
输出结果:
b1&&b2:false b1||b2:true !(b1&&b2):true
逻辑短路:
在Java中,逻辑运算符支持短路操作,一旦能够明确表达整个表达式的值,我们就不需要计算表达式的余下部分了。比如我们需要判断一个对象不为空且它的某个方法返回值不为空,我们就可以这样判断:
if(object!=null&&object.someFunction()!=null){ //dosomething. }
如果object为空,第一部分表达式object!=null会返回false,那么不管&&运算符后面的表达式object.someFunction()!=null的结果如何,最终的值都为false。编译器会自动将这部分运算进行优化,不会执行object.someFunction()!=null。
5.关系运算符
用来比较两个变量数据的大小,返回boolean的值,即true或者false
关系操作符包括:
关系运算符 | 关系 |
---|---|
> | 大于 |
< | 小于 |
== | 等于 |
!= | 不等于 |
>= | 大于等于 |
<= | 小于等于 |
'=='和'!='适用于所有类型的值和对象(即基本类型变量和引用类型变量)。
'>'、'<'、'>='和'<='不适用于布尔类型的值,因为它们只有true或false,大于和小于并无实际意义。
publicclassOperatorsDemo{ publicstaticvoidmain(String[]args){ intnum1=10; intnum2=50; if(num1==num2){ System.out.println("num1andnum2areequal"); }else{ System.out.println("num1andnum2arenotequal"); } if(num1!=num2){ System.out.println("num1andnum2arenotequal"); }else{ System.out.println("num1andnum2areequal"); } if(num1>num2){ System.out.println("num1isgreaterthannum2"); }else{ System.out.println("num1isnotgreaterthannum2"); } if(num1>=num2){ System.out.println("num1isgreaterthanorequaltonum2"); }else{ System.out.println("num1islessthannum2"); } if(num1输出结果:
num1andnum2arenotequal num1andnum2arenotequal num1isnotgreaterthannum2 num1islessthannum2 num1islessthannum2 num1islessthanorequaltonum26.位运算符
位运算符面向的运算对象是二进制的“位”,可应用于整数类型(int),长整型(long),短整型(short),字符型(char),和字节型(byte)等类型,运算时会将其对应Bit位(0或者是1)进行布尔代数运算或者移动操作。
位运算符 计算逻辑 & 与运算:对于某一位,只要两个操作数都为1,则该位的结果为1,否则为0 ` ` ^ 异或运算:对于某一位,如果两个操作数不相同,则该位的结果为1,否则为0 ~ 非运算:按位补运算符翻转操作数的每一位 << 二进制左移运算符:左操作数按位左移右操作数指定的位数 >> 二进制右移运算符:左操作数按位右移右操作数指定的位数 >>> 二进制右移补零操作符:左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充 计算逻辑的描述读起来有些晦涩,我们通过例子可以更清晰得了解位运算符如何进行计算。假设如果x等于60;y等于13;则它们的二进制表示,以及位运算的结果如下所示:
x=00111100 y=00001101 ----------------- x&y=00001100 x|y=00111101 x^y=00110001 ~x=11000011 x<<2=11110000 x>>2=00001111 x>>>2=00001111注意>>和>>>的区别:
右移位运算符>>,若操作的值为正,则在高位插入0;若值为负,则在高位插入1;
右移补零操作符>>>,无论正负,都在高位插入0。
>位运算不理解,先跳过。实际用到的时候,可以再去研究。
7.运算符的优先级
运算符优先级决定一个表达式里术语的分组。它影响着一个表达式如何求值。一定的运算符比其他运算符拥有更高的优先级。
例如:乘法运算符比加法运算符有更高的优先级,表达式1+5*6,根据运算符的优先级,编译器会先计算5*6,再计算30+1,最终得到结果31。
各类各运算符的优先级从大到小如下:
.,(),[] 单目+(右到左结合),单目-(右到左结合),++,--,~,! *,/,% +(左到右结合),-(左到右结合) >>,<<,>>> <,<=,>,>= ==,!= & | ^ && || ?: =,+=等赋值运算符
不用担心这么复杂的优先级列表,绝大多数情况下,表达式本身就很容易看得出优先级,比如赋值运算肯定是优先级最低的。在对优先级不太明确的情况下,我们使用括号就能按照我们希望的方式来改变优先级,所以不需要对运算符优先级做太多记忆。
8.其他运算符
三运运算符:
Java中的条件运算符是一个三元运算符,它的形式如下:
booleanExpression?valueWhenTrue:valueWhenFalse如果布尔表达式值为true,则表达式的值为valueWhenTrue的值,否则为valueWhenFalse的值。
比如我们要计算x的绝对值,可以通过如下代码实现:
if(x>=0){ y=x; }else{ y=-x; }通过三元运算符,只需要一条语句y=x>=0?x:-x;就可以完成,更为简洁。
类型转换运算符:
我们在很多情况下会用到类型转换。在适当的时候,Java也会根据数据类型将数据类型自动转为另一种。比如我们为float变量赋一个整数值,编译器会将int转化为float赋给变量。
但是在很多情况下,Java并不能判断我们是否需要进行类型转换,这时就需要类型转化运算符,它允许我们显式地进行类型转换,如:
inta=10; longb=(long)a; longc=(long)100;我们对变量和常量都能进行类型转换。
在对浮点数进行类型转换时,我们需要注意截尾的问题。如我们要将10.9进行类型转换:(int)10.9,它的值并不是四舍五入的11,而是10