第三章 运算符和表达式
运算符指明对操作数所进行的运算。按操作数的数目来分+ -),二元运算符(如+、>)和三元运算符(如?,它们分别对应于一 于一元运算符来说,可以有前缀表达式(如++i)和后缀表达式(如 采用中缀表达式(如a+b)。按照运算符功能来分,基本的运算符? 下面几类:
算术运算符(+,-,*,/,%,++,--)
关系运算符(>,<,>=,<=,==,!=)
布尔逻辑运算符(!,&&,||)
位运算符(>>,<<,>>>,&,|,^,~)
赋值运算符(=,及其扩展赋值运算符如+=)
条件运算符(?
其它(包括分量运算符·,下标运算符[],实例运算符instance of,内存分配运算符new,强制类 型转换运算符(类型),方法调用运算符()等)
本章中我们主要讲述前6类运算符。
§3.1算术运算符
算术运算符作用于整型或浮点型数据,完成算术运算。
一、二元算术运算符,如下表所示
运算符
用法
描述
+ op1+op2 加
- op1-op2 减
* op1*op2 乘
/ op1/op2 除
% op1%op2 取模(求余)
Java对加运算符进行了扩展,使它能够进行字符串的连接,如" abc"+"de",得到串"abcde"。我 们将在第七章中讲解。
与C、C++不同,对取模运算符%来说,其操作数可以为浮点数, 如37.2%10=7.2。
二、一元算术运算符,如下表所示:
运算符
用法
描述
+ +op 正值
- -op 负值
++ ++op,op++ 加1
-- --op,op-- 减1
i++与++i的区别
i++在使用i之后,使i的值加1,因此执行完i++后,整个表达式的 ?为i,而i的值变为i+1。
++i在使用i之前,使i的值加1,因此执行完++i后,整个表达式和i 的"+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);
}
}
其结果为:
C:\>java ArithmaticOp
a=9
b=18
c=4
d=14
e=-14
f=-2
g=18.4
h=2.4
i=5
j=3
k=5
§3.2关系运算符
关系运算符用来比较两个值,返回布尔类型的值true或false? 关系运算符都是二元运算 符,如下表所示:
运算符
用法
返回true的情况
> op1>op2 op1大于op2
>+ op1>=op2 op1大于或等于op2
< op1<op2 op1小于op2
<= op1<=op2 op1小于或等于op2
== op1==op2 op1与op2相等
!= op1!=op2 op1与op2不等
Java中,任何数据类型的数据(包括基本类型和组合类型)都可 以通过==或!=来比较是否 相等(这与C、C++不同)。
关系运算的结果返回true或false,而不是C、C++中的1或0。
关系运算符常与布尔逻辑运算符一起使用,作为流控制语? 的判断条件。如
if(a>b&&b==c)
§3.3布尔逻辑运算符
布尔逻辑运算符进行布尔逻辑运算,如下表所示:
op1 op2 op1&&op2 op1||op2 !op1
false false false false true
false true false true true
true false false true false
true true true true false
·&&、‖ 为二元运算符,实现逻辑与、逻辑或。
·!为一元运算符,实现逻辑非。
·对于布尔逻辑运算,先求出运算符左边的表达式的值,对或运算如果为true,则整个表 达式的结果为true,不必对运算符右边的表达式再进行运算;同样,对与运算,如果左边表达式 的值为false,则不必对右边的表达式求值,整个表达式的结果为false。
下面的例子说明了关系运算符和布尔逻辑运算符的使用。
public class RelationAndConditionOp{
public static void main(Stringargs[]){
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);
}
}
其运行结果为:
C:\>java RelationAndConditionOp
a<b=false
a/e=8
f=0
注意:上例中,第二个if语句在运行时不会发生除0溢出的错 ,因为e!=0为false,所以就不需 要对a/e进行运算。
§3.4位运算符
位运算符用来对二进制位进行操作,Java中提供了如下表所 的位运算符: 位运算符中,除 ~ 以外,其余均为二元运算符。 操作数只能为整型和字符型数据。
3.4.1补码
Java使用补码来表示二进制数,在补码表示中,最高位为符号 ?,正数的符号位为0,负数 为1。补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制? 示),如+42的补码为 00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数 1,即得该数的补码。如 -42的补码为11010110(00101010按位取反11010101+111010110)
用补码来表示数,0的补码是唯一的,都为00000000。(而在原码, 反码表示中,+0和-0的表示 是不唯一的,可参见相应的书籍)。而且可以用111111表示-1的补 (这也是补码与原码和反 码的区别)。
3.4.2按位取反运算符 ~
~ 是一元运算法,对数据的每个二进制位取反,即把1变为0 ,把0变为1。 例如:
0010101
~
1101010
注意,~运算符与-运算符不同,~21≠-21。
3.4.3按位与运算符&
参与运算的两个值,如果两个相应位都为1,则该位的结果为1例如:
0010101
~ 1101010
注意,~运算符与-运算符不同,~21≠-21。
3.4.3按位与运算符&
参与运算的两个值,如果两个相应位都为1,则该位的结果为1 ,否则为0。即:
0&0=0,0&1=0,1&0=0,1&1=1
文章评论(0条评论)
登录后参与讨论