首页 > 代码库 > java运算符与表达式

java运算符与表达式

1. 算术运算符与算术表达式
(1) 加减运算符 +,-.例如 2+39,908.98-23等.
加减运算符是双目运算符,即连接两个操作元的运算符.加减运算符的结合方向是从左到右.例如: 2+3-8,先计算2+3,然后再将得到的结果减8.加减运算符的操作元是整型或浮点型数据,加减运算符的优先级是4级.

(2) 乘,除和求余运算符 *,/,%.例如 2*39 908.98/23等.
*,/,%运算符是双目运算符,即连接两个操作元的运算符.*,/,%运算符的结合方向是从左到右,例如 2*3/8,先计算2*3,然后再将得到的结果除以8.乘除运算符的操作元是整型或浮点型数据.*,/,%运算符的优先级是3级.
用算术符号和括号连接起来的符合java语法规则的式子,如x+2*y-30+3*(y+5).

2 自增,自减运算符 ++,--
自增,自减运算符是单目运算符,可以放在操作元之前,也可以放在操作元之后.操作元必
须是一个整型或浮点型变量.作用是使变量的值增1或减1,如
++x,--x表示在使用x之前,先使x的值加 减 1 .
x++,x— 表示在使用x之后,使x的值加 减 1.
粗略的看,++x和x++的作用相当于x=x+1.但++x和x++的不同之处在于,++x 是先执行x=x+1再使用x的值,而x++是先使用x的值再执行x=x+1.如果 x的原值是5,则
对于y=++x y的值为6.
对于y=x++ y的值为5,然后x的值变为6.

3 算术混合运算的精度
精度从”底”到”高”排列的顺序是
byte short int long float double
Java将按运算符两边的操作元的最高精度保留结果的精度,例如
5/2的结果是2,要想得到2.5,必须写成5.0/2或5.0f/2.
char型数据和整型数据运算结果的精度是int.例如
byte x=7;
那么
‘B’+x;
的结果是int型,因此下列写法是不正确的,
char ch=’B’+x;
应当写成
char ch=(char)(’B’+x);

4 关系运算符与关系表达式
关系运算符用来比较两个值的关系.关系运算符的运算结果是boolean 型,当运算符对应的关系成立时,运算结果是true,否则是false.例如,10<9的结果是false,5>1的结果是true,3!=5的结果是true,10>20-17的结果为true,因为算术运算符的级别高于关系运算符,10>20-17 相
当于10> 20-17 ,结果当然是true.
结果为数值型的变量或表达式可以通过关系运算符形成关系表达式.如,4>8,(x+y)>80.

5 逻辑运算符与逻辑表达式
逻辑运算符包括 &&,||,!.其中&&,||为二目运算符,实现逻辑与,逻辑或 为单目运算符,实现逻辑非.逻辑运算符的操作元必须是boolean 型数据 ,逻辑运算符可以用来连接关系表达式.

例如,2>8&&9>2 的结果为false,2>8||9>2 的结果为true.由于关系运算符的级别高于&&,||的级别,2>8&&8>2相当于 2>8 && 9>2 .
逻辑运算符”&&”和”||”也称做短路逻辑运算符,这是因为当op1 的值是false 时,”&&”运算符在运算时不再去计算op2 的值,直接就得出op1&&op2 的结果是false.当op1 的值是true时,”||”运算符号在运算时不再去计算op2的值,直接就得出op1|op2的结果是true.比如,x
的初值是1,那么经过下列逻辑比较运算后,
((y=1)==0))&&((x=6)==6));
x的值仍然是1.经过下列逻辑比较运算后,
((y=1)==1))&&((x=6)==6));
x的值将变为6.

6 赋值运算符与赋值表达式
赋值运算符 =.
赋值运算符是双目运算符,左面的操作元必须是变量,不能是常量或表达式.设x 是一个整型变量,y 是一个boolean 型变量,x=20 和y = true 都是正确的赋值表达式,赋值运算符的优先级较低,是14 级,结合方向右到左.赋值表达式的值就是”=“左面变量的值.注意不要将赋值运算符”=“与等号运算符”==“混淆.

7位运算符
我们知道整型数据在内存中以2 进制的形式表示,比如一个int 型的变量在内存中占4个字节共32位,int 型数据7的2进制表示是
00000000 00000000 00000000 00000111
左面最高位是符号位,最高位是0表示正数,1表示负数.负数采用补码表示,比如-8 的进制是
111111111 111111111 1111111 11111000
这样我们就可以对整型数据进行按位的运算,比如,对两个整型数据对应的位进行运算得到一个新的整型数据

1 ”按位与”运算符
“&”是双目运算符,对两个整型数据a,b 按位进行运算,运算结果是一个整型数据c.运算法则是 如果a,b 两个数据对应位都是1,则c 的该位是1,否则是0.如果b 的精度高于a,那么结果c的精度和b相同.

2”按位或”运算符
“|”是双目运算符.对两个整型数据a,b 按位进行运算,运算结果是一个整型数据c.运算法则是 如果a,b 两个数据对应位都是0,则c 的该位是0,否则是1.如果b 的精度高于与a,那么结果c的精度和b相同.

3 ”按位非”运算符
“~”是单目运算符.对一个整型数据a 按位进行运算,运算结果是一个整型数据c.运算法则是 如果a对应位都是0,则c的该位是1,否则是1.
“按位异或”运算符

4 ”^”是双目运算符.对两个整型数据a,b按位进行运算,运算结果是一个整型数据c.运算法则是 如果a,b 两个数据对应位相同,则c 的该位是0,否则是1.如果b 的精度高于与a,那么结果c的精度和b相同.
由异或运算法则可知
a^a=0,
a^0=a.
因此,如果c=a^b,那么a=c^b,即用同一个数对数a进行两次”异或”运算的结果又是数a.在下面的例子1 中,利用”异或”运算的性质,对几个字符进行加密并输出密文,然后再解密.

例子1
class Example1
{ public static void main(String args[])
{char a1=‘十‘,a2=‘点‘,a3=‘进‘,a4=‘攻‘;
char secret=‘8‘;
a1=(char)(a1^secret); a2=(char)(a2^secret);
a3=(char)(a3^secret); a4=(char)(a4^secret);
System.out.println("密文:"+a1+a2+a3+a4);
a1=(char)(a1^secret); a2=(char)(a2^secret);
a3=(char)(a3^secret); a4=(char)(a4^secret);
System.out.println("原文:"+a1+a2+a3+a4);
}
}

位运算符也可以操作逻辑型数据,法则是
当a,b都是true时,a&b是true,否则a&b是false.
当a,b都是false时,a|b是false,否则a|b是true.
当a是true时,~a是false 当a是false时,~a是true.
位运算符在操作逻辑型数据时,与逻辑运算符&&,||,, 不同的是 位运算符要计算完a和b的之后再给出运算的结果.比如,x的初值是1,那么经过下列逻辑比较运算后,
((y=1)==0))&&((x=6)==6));
x的值仍然是1,但是如果经过下列位运算之后,
((y=1)==0))&((x=6)==6));
x的值将是6.
位运算符也可以操作字符数据,但运算结果是int 型数据,例如
char x=’a’,y=’b’;
那么
x^y,x&y,x^y, x
的结果是int型.
通过下面的例子可以比较出短路逻辑运算和位运算的不同.

例子2
class Example2
{ public static void main(String args[])
{ int x,y=10;
if(((x=0)==0)||((y=20)==20))
{ System.out.println("现在y的值是:"+y);
}
int a,b=10;
if(((a=0)==0)|((b=20)==20))
{ System.out.println("现在b的值是:"+b);
}
}
}

8 instanceof 运算符
该运算符是双目运算符,左面的操作元是一个对象 右面是一个类.当左面的对象是右面的类创建的对象时,该运算符运算的结果是true ,否则是false.

9 运算符综述
Java 的表达式就是用运算符连接起来的符合Java 规则的式子.运算符的优先级决定了表达式中运算执行的先后顺序.例如,x<y&&!z相当于(x<y)&&(!z),没有必要去记忆运算符号的优先级别,在编写程序时可尽量的使用括号 运算符号来实现你想要的运算次序,以免产生难以阅读或含糊不清的计算顺序.运算符的结合性决定了并列相同级别的运算符的先后顺序,例如,加减的结合性是从左到右,8-5+3 相当于 8-5 +3.逻辑否运算符 的结合性是右到左, x 相当于!(!x).表3.4是Java所有运算符的优先级和结合性,有些运算符我们没有介绍,可参见相关书籍.


java运算符与表达式