运算符指明对操作数所进行的运算。按操作数的数目来分一元(如+-),二元运算符(如+、>)和三元运算符(如?:),它们分别对应于一元运算符来说,可以有前缀表达式(如++i)和后缀表达式(如采用中缀表达式(如a+b)。按照运算符功能来分,基本的运算符分下面几类:
1.算术运算符(+,-,*,/,%,++,--)
2.关系运算符(>,<,>=,<=,==,!=)
3.布尔逻辑运算符(!,&&,||,—,|)
4.位运算符(>>,<<,>>>,&,|,^,~)
5.赋值运算符(=,及其复合赋值运算符如+=)
6.条件运算符(?:)
本章中我们主要讲述这6类运算符。
§2.1 算术运算符
算术运算符作用于整型或浮点型数据,完成算术运算。
一、二元算术运算符,如下表所示:
运算符 运算 举例说 明
+ 加 a+b 求a与b相加的和
+ 减 a-b 求a与b相减的差
* 乘 a*b 求a与b相乘的积
/ 除 a/b 求a除以b的商
% 取模 a%b 求a除以b所得的余数
运算符 用法 描述
+ op1+op2 加
- op1-op2 减
* op1*op2 乘
/ op1/op2 除
% op1%op2 取模(求余)
Java对"加"运算符进行了扩展,使它能够进行字符串的连接,如"abc"+"de",得到串"abcde"。我们将在以后讲解。
与C、C++不同,对取模运算符%来说,其操作数可以为浮点数,如37.2%10=7.2。
二、一元算术运算符
运算符 说 明
+ 正值
- 负值
++ 自加1
-- 自减1
i++与++i的区别:
i++在使用i之后,使i的值加1,因此执行完i++后,整个表达式的值为i,而i的值变为i+1。
++i在使用i之前,使i的值加1,因此执行完++i后,整个表达式和i的值均为i+1。
对i--与--i同样。
浮点变量也可以使用++和--操作符,作用与整型变量相同。
例2.1.下面的例子说明了算术运算符的使用
public class ArithmaticOp{
public static void main(String args[]){
int a=5+4;//a=9
int b=a*2;//b=18
int c=b/4;//c=4
int d=b-c;//d=14
int e=-d;//e=-14
int f=e%4;//f=-2
double g=18.4;
double h=g%4;//h=2.4
int i=3;
int j=i++;//i=4,j=3
int k=++i;//i=5,k=5
System.out.println("a="+a);
System.out.println("b="+b);
System.out.println("c="+c);
System.out.println("d="+d);
System.out.println("e="+e);
System.out.println("f="+f);
System.out.println("g="+g);
System.out.println("h="+h);
System.out.println("i="+i);
System.out.println("j="+j);
System.out.println("k="+k);
}
}
2.2 关系运算符
关系运算符用来比较两个值,返回布尔类型的值true或false,关系运算符都是二元运算符,如下表所示:
运算符 含义 举例 说 明
< 小于 a<b a小于b
<= 小于等于 a<=b a小于等于b
> 大于 a>b a大于b
>= 大于等于 a>=b a大于等于b
== 等于 a==b a等于b
!= 不等于 a!=b a不等于b
Java中,任何数据类型的数据(包括基本类型和组合类型)都可以通过==或!=来比较是否相等(这与C、C++不同)。
关系运算的结果返回true或false,而不是C、C++中的1或0。
关系运算符常与布尔逻辑运算符一起使用,作为流控制语的判断条件。如
if(a>b&&b==c)
例2.2 下面的例子说明了关系运算符的使用
public class CompareNumber
{
public static void main(String[] args)
{
int n=3;
int m=4;
System.out.println();
System.out.println("n<m is "+(n<m));
System.out.println("n=m is "+((++n)==m));
System.out.println("n>m is "+((++n)>m));
System.out.println("n is "+n);
}
}
布尔逻辑运算符
逻辑运算是针对布尔型数据进行的运算,运算的结果仍然是布尔型量。常用的运算符如下:
运算符 运算 例子 说 明
! 逻辑非 !x x真时为假,x假时为真
&& 逻辑与 x&&y x,y都真时结果才为真
& 非简洁与 x&y x,y都真时结果才为真
|| 逻辑或 x||y x,y都假时结果才为假
| 非简洁或 x|y x,y都假时结果才为假
^ 取或 x^y x,y同真假时结果为假
真值表:
op1 op2 op1&&op2 op1&op2 op1||op2 op1|op2 !op1
false false false false false false true
false true false false true true true
true false false false true true false
true true true true true true false
·&&、&、‖、| 为二元运算符,实现逻辑与、逻辑或。
·!为一元运算符,实现逻辑非。
1.对于布尔逻辑运算,先求出运算符左边的表达式的值,然后在运算;
2.对逻辑或||的运算,如果左边表达式的值为true,则整个表达式的结果为true,不必对运算符右边的表达式再进行运算,非简洁或|和逻辑或||的真值表是一样的,不同的是运算符右边的表达式无论什么情况都要运算;
3.对逻辑与&&运算,如果左边表达式的值为false,则不必对右边的表达式求值,整个表达式的结果为false。非简洁与&和逻辑与&&的真值表是一样的,不同的是运算符右边的表达式无论什么情况都要运算;
例2.3下面的例子说明了关系运算符和布尔逻辑运算符的使用。
public class RelationAndConditionOp{
public static void main(String[] args){
int a=25,b=3;
boolean d=a<b;//d=false
System.out.println("a<b="+d);
int e=3;
if(e!=0&&a/e>5)
System.out.println("a/e="+a/e);
int f=0;
if(f!=0&&a/f>5)
System.out.println("a/f="+a/f);
else
System.out.println("f="+f);
}
}
注意:上例中,第二个if语句在运行时不会发生除0溢出的错,因为e!=0为false,所以就不需要对a/e进行运算。
位运算符
位运算是对操作数以二进制为单位进行的操作和运算,位运算的操作数和结果都是整形变量,Java中提供了如下表所的位运算符:位运算符中,除 ~ 以外,其余均为二元运算符。操作数只能为整型和字符型数据。
运算符 运算 例子 说 明
~ 求补(位反) ~x 将x按比特位取反
<< 向左移位,从右边补0 x>>a x各比特位左移a位
>> 向右移位,从坐侧传递符号位 x<<a x各比特位右移a位
>>> 无符号向右移位,从左边补0 x>>>a x各比特位右移a位,左边的空位填零
位运算符通常与硬件打交道时用到,在Java中一般不太常用。
§2.5 赋值运算符(复合赋值运算符)
赋值语句是程序设计最基本的语句之一,赋值运算的符号是等号,其右部是一个表达式,左部是变量,它把右部的值赋给左部的变量,等号左边的变量称为左值lvalue,右边称为右值rvalue。在Java中,赋值语句像函数一样有返回值,它的返回值即左值,有些语言没有这一特点。
运算符 例子 解释
+= x+=a x=x+a
-+ x-=a x=x-a
*= x*=a x=x*a
/= x/=a x=x/a
%= x%=a x=x%a
&= x&=a x=x&a
|= x|=a x=x|a
^= x^=a x=x^a
<<= x<<=a x=x<<a
>>= x>>=a x=x>>a
<<<= x<<<=a x=x<<<a
例2.4下面的例子说明了赋值运算的使用。
public class LValue{
public static void main(String[] args){
int x=1,y=12;
x+=2;
y-=3;
System.out.println();
System.out.println("x= "+x+" y= "+y);
y/=x;
System.out.println("x= "+x+" y= "+y);
y++;
y%=x;
System.out.println("x= "+x+" y= "+y);
}
}
三目运算符
Java中的三墓运算符与C语言中的完全相同,使用形式为:
x?y:z;
这就是说,先计算x的值,若x为真,怎整个表达式的结果为y的值,若x为假,则整个表达式的值为表达式z的值。
例如:
int x=5,y=8,z=2;
int k=x<3?y:z; //因为x<3,所以k=z=2;
int j=x>0?x:-x //y的值始终为x的绝对值。
|