3.4 运算符、表达式与语句
程序由很多语句组成,而语句的基本单位是表达式和运算符。
3.4.1 运算符
Java语句有很多种形式,表达式是其中一种。
表达式由操作数与运算符组成,操作数可以是常量、变量,也可以是方法;运算符就是数学中的运算符号。
运算符可分为以下种类:
1.赋值运算符
赋值运算符 赋值运算符号 描述 = 赋值 =是赋值的意思,不是等于的意思。
语法:变量名称=设置值;
package com; public class OperatorDemo01 { public static void main(String[] args) { int num=22; System.out.println("第一次输出num="+num); num=num-3; System.out.println("第二次输出num="+num); } }
第一次输出num=22 第二次输出num=19 Process finished with exit code 0
int sum=num1+num2; //num1与num2相加之后的值赋给变量sum存放,num1和num2值不变
2.一元运算符
+3; //表示正3 b=-a; //表示负a的值赋给变量b存放 !a; //a的NOT运算,若a为0,则!a为1;若a不为0,则!a为0
一元运算符 序号 一元运算符 描述 1 + 正号 2 - 负号 3 ! NOT,否 package com; public class OperatorDemo02 { public static void main(String[] args) { boolean b=false; int x=10; int y=-30; System.out.println("b="+b+",!b="+!b); System.out.println("x="+x+",-x="+ -x); //++连一起的话表示自增,无法与字符串连接 System.out.println("y="+y+",+y="+ +y); //加上空格表示不是自增,相当于字符串连接数字 } }
b=false,!b=true x=10,-x=-10 y=-30,+y=-30 Process finished with exit code 0
3.算术运算符
算术运算符 序号 算术运算符 描述 1 + 加法 2 - 减法 3 * 乘法 4 / 除法 5 % 取模(取余数) package com; public class OperatorDemo03 { public static void main(String[] args) { int i=10; int j=3; System.out.println("i+j="+(i+j)); System.out.println("i-j="+(i-j)); System.out.println("i*j="+(i*j)); System.out.println("i/j="+(i/j)); System.out.println("i%j="+(i%j)); } }
i+j=13 i-j=7 i*j=30 i/j=3 i%j=1 Process finished with exit code 0
4.关系运算符
if语句格式:if(布尔表达式){
语句;
}
关系运算符 序号 关系运算符 描述 1 > 大于 2 < 小于 3 >= 大于等于 4 <= 小于等于 5 == 等于 6 != 不等于 package com; public class OperatorDemo04 { public static void main(String[] args) { System.out.println("3>1="+(3>1)); System.out.println("3<1="+(3<1)); System.out.println("3>=1="+(3>=1)); System.out.println("3<=1="+(3<=1)); System.out.println("3==1="+(3==1)); System.out.println("3!=1="+(3!=1)); } }
3>1=true 3<1=false 3>=1=true 3<=1=false 3==1=false 3!=1=true Process finished with exit code 0
if语句经常使用到关系运算符,条件判断为一个布尔表达式或布尔值
如果if语句只有一条语句,可以不加{},但为了方便调试,不建议省略
5.自增与自减运算符
自增与自减运算符 序号 自增与自减运算符 描述 1 ++ 自增,变量值加1 2 -- 自减,变量值减1 自增与自减运算符使程序更简洁。
eg:a=a+1;与a++;意义相同
a++和++a的区别:a++先使用后加1,++a先加1后使用
package com; public class OperatorDemo06 { public static void main(String[] args) { int a=3,b=3; int x=6,y=6; System.out.println("a="+a); System.out.println("\ta++="+(a++)+",a="+a); System.out.println("b="+b); System.out.println("\t++b="+(++b)+",b="+b); System.out.println("x="+x); System.out.println("\tx--="+(x--)+",x="+x); System.out.println("y="+y); System.out.println("\t--y="+(--y)+",y="+y); } }
a=3 a++=3,a=4 b=3 ++b=4,b=4 x=6 x--=6,x=5 y=6 --y=5,y=5 Process finished with exit code 0
6.逻辑运算符
逻辑运算符 序号 逻辑运算符 描述 1 & AND,与 2 && 短路与 3 | OR,或 4 || 短路或 &&,两个均为真,返回真
||,其中一个为真,返回真
AND与OR结果表 序号 条件1 条件2 &&(与) ||(或) 1 true true true true 2 true false false true 3 false true false true 4 false false false false 如果需要同时判断多个条件,使用以上逻辑运算符
package com; public class OperatorDemo08 { public static void main(String[] args) { int score=50; //定义变量score if((score<0)||(score>100)){ //判断成绩是否有错 System.out.println("输入的成绩有误"); } if((score<60)&&(score>49)){ //判断成绩结果 System.out.println("补考吧,比重修要好"); } } }
补考吧,比重修要好 Process finished with exit code 0
两种与和或,区别?
&&:短路与 &:非短路与(与)
||:短路或 |:非短路或(或)
1.&要求所有的条件都判断,&&若第一个条件为false,则后面不判断
2.|要求所有的条件都判断,||若第一个条件为true,则后面不判断
&:
package com; public class OperatorDemo09 { public static void main(String[] args) { if(10!=10&10/0==0){ System.out.println("条件满足"); } } }
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.OperatorDemo09.main(OperatorDemo09.java:5) Process finished with exit code 1
&&:
package com; public class OperatorDemo10 { public static void main(String[] args) { if(10!=10&&10/0==0){ System.out.println("条件满足"); } } }
Process finished with exit code 0
|:
package com; public class OperatorDemo11 { public static void main(String[] args) { if(10!=10|10/0==0){ System.out.println("条件满足"); } } }
Exception in thread "main" java.lang.ArithmeticException: / by zero at com.OperatorDemo11.main(OperatorDemo11.java:5) Process finished with exit code 1
||:
package com; public class OperatorDemo12 { public static void main(String[] args) { if(10==10||10/0==0){ System.out.println("条件满足"); } } }
条件满足 Process finished with exit code 0
7.括号运算符
括号运算符 括号运算符 描述 () 提高括号中表达式的优先级 括号运算符可以使括号内表达式优先处理。
package com; public class OperatorDemo14 { public static void main(String[] args) { int result1=3+5+4*6-7; int result2=(3+5+4)*(6-7); System.out.println("3+5+4*6-7="+result1); System.out.println("(3+5+4)*(6-7)="+result2); } }
3+5+4*6-7=25 (3+5+4)*(6-7)=-12 Process finished with exit code 0
8.位运算符
位运算操作就是指进行二进制位的运算。
位运算符 序号 位运算符 描述 1 & 按位与 2 | 按位或 3 ^ 异或() 4 ~ 取反 5 << 左移位 6 >> 右移位 7 >>> 无符号右移位 在Java中所有数据都是以二进制的形式运算的,即如果是一个int型变量,要采用位运算时必须将其变为二进制数据。
位运算的结果表 序号 二进制数1 二进制数2
与操作(&) 或操作(|) 异或操作(^) 1 0 0 0 0 0 2 0 1 0 1 1 3 1 0 0 1 1 4 1 1 1 1 0 package com; public class OperatorDemo15 { public static void main(String[] args) { int x=3; //3的二进制数据:00000000 00000000 00000000 00000011 int y=6; //6的二进制数据:00000000 00000000 00000000 00000110 System.out.println(x&y); //与操作的结果: 00000000 00000000 00000000 00000010 System.out.println(x|y); //或操作的结果: 00000000 00000000 00000000 00000111 System.out.println(x^y); //异或操作结果: 00000000 00000000 00000000 00000101 } }
2 7 5 Process finished with exit code 0
在计算机的数据表示中只定义了正数的表示形式,没有定义负数的表示形式。负数一般都用补码的形式表示,正数的原码、反码、补码都相同,负数的反码是除符号位为1外,其它位全取反;补码=反码+1
package com; public class OperatorDemo16 { public static void main(String[] args) { //-3原码: 10000000 00000000 00000000 00000011 int x=-3; //-3反码: 11111111 11111111 11111111 11111100 System.out.println(x+"的反码是:"+~x); //-3补码: 11111111 11111111 11111111 11111101 //取反: 00000000 00000000 00000000 00000010 即2 } }
-3的反码是:2 Process finished with exit code 0
左移<<是将运算数的二进制码整体左移指定位数,左移之后的空位使用0来填充。
右移>>是将运算数的二进制码整体右移指定位数,右移之后的空位以符号位填充。如果是正数使用0填充,如果是负数使用1填充。
package com; public class OperatorDemo18 { public static void main(String[] args) { int x=3; //3的二进制数据: 00000000 00000000 00000000 00000011 System.out.println(x+"左移两位之后的内容"+(x<<2)); //左移两位,空位用0填充: 00000000 00000000 00000000 00001100 int a=3; int b=-3; //-3的二进制数据: 11111111 11111111 11111111 11111101 System.out.println(a+"右移两位之后的内容"+(a>>2)); //右移两位,空位用0填充: 00000000 00000000 00000000 00000000 System.out.println(b+"右移两位之后的内容"+(b>>2)); //右移两位,空位用1填充: 11111111 11111111 11111111 11111111补码转换为原码为-1 } }
3左移两位之后的内容12 3右移两位之后的内容0 -3右移两位之后的内容-1 Process finished with exit code 0
无符号右移>>>,空位用0填充
package com; public class OperatorDemo19 { public static void main(String[] args) { int a=3; //3的二进制数据: 00000000 00000000 00000000 00000011 int b=-3; //-3的二进制数据: 11111111 11111111 11111111 11111101 System.out.println(a+"无符号右移两位之后的内容"+(a>>>2)); //无符号右移两位,空位用0填充: 00000000 00000000 00000000 00000000 System.out.println(b+"无符号右移两位之后的内容"+(b>>>2)); //无符号右移两位,空位用0填充: 00111111 11111111 11111111 11111111 } }
3无符号右移两位之后的内容0 -3无符号右移两位之后的内容1073741823 Process finished with exit code 0
对于位操作只适用于byte、short、int、char、long类型,而且位操作之后的原始内容不改变。
9.运算符的优先级
运算符的优先级 优先级 运算符 类 结合性 1 () 括号运算符 由左至右 1 [] 方括号运算符 由左至右 2 ! +(正号) -(负号) 一元运算符 由右至左 2 ~ 位逻辑运算符 由右至左 2 ++ -- 自增与自减运算符 由右至左 3 * / % 算术运算符 由左至右 4 + - 算术运算符 由左至右 5 << >> 位左移、右移运算符 由左至右 6 > >= < <= 关系运算符 由左至右 7 == != 关系运算符 由左至右 8 &(位运算符AND) 位逻辑运算符 由左至右 9 ^(位运算符XOR) 位逻辑运算符 由左至右 10 |(位运算符OR) 位逻辑运算符 由左至右 11 && 逻辑运算符 由左至右 12 || 逻辑运算符 由左至右 13 ?: 三目运算符 由右至左 结合性决定当使用同一优先级的运算符时,谁会先被处理。“由左至右”,就是在相同优先级的运算符中,先由运算符左边的操作数开始处理,再处理右边的操作数。
3.4.2 简洁表达式
表达式是由常量、变量或是其他操作数与运算符所组合而成的语句。
eg:-49 表达式由一元运算符-和常量49组成
sum+2 表达式由变量sum、算术运算符与常量2组成
a+b-c/(d*3-9) 表达式由变量、常量与运算符所组成
还有一些将算术运算符和赋值运算符结合成为新的运算符。
序号 | 运算符 | 范例用法 | 说明 | 描述 |
1 | += | a+=b | a+b的值存放到a中 | a=a+b |
2 | -= | a-=b | a-b的值存放到a中 | a=a-b |
3 | *= | a*=b | a*b的值存放到a中 | a=a*b |
4 | /= | a/=b | a/b的值存放到a中 | a=a/b |
5 | %= | a%=b | a%b的值存放到a中 | a=a%b |