计算机的基本用途就是执行数学运算,Java提供了一套丰富的运算符来操作变量。
算术运算符
① +,-,*,/,% 属于二元运算符。% 是取模运算符,就是我们常说的求余数操作
② 算术运算符中 ++(自增),--(自减)属于一元运算符
二元运算符的运算规则:
整数运算:
① 如果两个操作数有一个为long ,则结果也为 long
② 没有 long 时,结果也为int 。即使操作数全为short,byte,结果也是int
浮点运算:
① 如果两个操作数有一个为double,则结果为double
② 只有两个操作数都是float,则结果才为float
取模运算:
① 其操作数可以为浮点数,一般使用整数,结果是"余数","余数"符号和左边操作数相同
② 如:7 % 3 = 1 -7 % 3 = -1 7 % -3 = 1
eg.算术运算符
/**
*测试算术运算符的用法
*/
public class TestOperator01 {
public static void main(String[] args){
int a = 3;
long b = 4;
long c = a + b;
System.out.println(c);
double d = 3+3.14;
int d2 = 32/3; // 两个整数相除,直接保留结果的整数部分,没有四舍五入
System.out.println(d);
System.out.println(d2);
//+,-,*,/
//取余数
int e = 10%3; //取余操作,结果符号和左边操作数相同
System.out.println(e);
//测试自增、自减
int g = 30;
g++; //相当于:g = g+1;
g--; //相当于:g = g-1;
g=10;
int h = g++; //g++先赋值。后自增
g=10;
int i = ++g; //++g先自增,后赋值
System.out.println(h);
System.out.println(i);
}
}
执行结果:
赋值及其扩展赋值运算符
eg.测试扩展运算符
/**
* 测试扩展运算符的用法
*/
public class TestOperator02 {
public static void main(String[] args){
int a = 3;
int b = 4;
a +=b; //相当于: a = a+b
System.out.println(a);
a = 3;
a *= b+3; //相当于: a = a*(b+3)
System.out.println(a);
}
}
执行结果:
关系运算符
关系运算符用来进行比较运算。关系运算的结果是布尔值:true / false;
Note:
● = 是赋值运算符,而真正的判断两个操作数是否相等的运算符是 ==
● == 、!= 是所有(基本和引用)数据类型都可以使用
● > 、>=、<、<= 仅针对数值类型(byte/short/int/long,float/double以及char)
eg.测试关系运算符
/**
* 测试关系运算符的用法
*/
public class TestOperator03 {
public static void main(String[] args) {
int a = 3;
int b = 4;
boolean c = a > b;
System.out.println(c);
char d='h';
//char值位于0~65536之间,可以通过(int)强制转型
System.out.println((int) d);
boolean e = d>100;
System.out.println(e);
}
}
执行结果:
逻辑运算符
逻辑运算符的操作数和运算符结果都是 boolean 值。
短路与和短路或采用短路的方式。从左到右计算,如果只通过运算符左边的操作数就能够确定表达式的值,则不会继续计算运算符右边的操作数,提高效率。
eg.测试逻辑运算符
/**
* 测试逻辑运算符
*/
public class TestOperator04 {
public static void main(String[] args){
boolean b1 =true;
boolean b2 =false;
System.out.println(b1&b2); //与:有一个false.结果:false
System.out.println(b1|b2); //或:有一个true. 结果:true
System.out.println(!b2); //取反
System.out.println(b1^b2); //异或:相同为false,不同为true
//短路与、短路或
//int b3 = 3/0; //会报不能除以0的异常
boolean b3 = 1>2 && (4<3/0);
System.out.println(b3);
}
}
执行结果:
位运算符
eg.测试位运算符
/**
* 测试位运算符
*/
public class TestOperator05 {
public static void main(String[] args){
int a = 7; //二进制 0111
int b = 8; //二进制 1000
System.out.println(a&b); //结果: 0
System.out.println(a|b); //结果: 15
System.out.println(a^b); //结果: 15
System.out.println(~b); //结果: -9
//移位
//乘以2,除以2.使用移位操作,最快!!
int c = 5<<2; //相当于:5*2*2
System.out.println(c);
System.out.println(40>>3); //相当于40/8
}
}
Note:
● & 和 | 既是逻辑运算符,也是位运算符。如果两侧操作数都是boolean 类型,就作为逻辑运算符。如果两侧的操作数是整数类型,就是位运算符。
● 不要把 ^ 当作数学运算乘方,是位的异或操作。
字符串连接符
+ 运算符两侧的操作数中只要有一个是字符串(String)类型,系统会自动将另一个操作数转换位字符串然后再进行连接。
eg.测试字符串连接符
/**
* 测试字符串连接符的用法
*/
public class TestOperator06 {
public static void main(String[] args){
String a = "3";
int b = 4;
System.out.println(a+b); //结果是字符串34,不是数字34
//条件是String, 不是char.若是char,则仍然是加法的意思
char c1 = 'h';
char c2 = 'i';
System.out.println(c1+c2);
System.out.println(""+c1+c2); //通过加空字符串,让整个+都变成连接符
}
}
执行结果:
条件运算符
String type = score < 60? 不及格:及格;
x 为boolean 类型表达式,先计算 x 的值,若为true ,则整个运算的结果为表达式y的值,否则整个运算结果为表达式z的值。
eg.条件运算符
/**
* 测试条件(三元)连接符的用法
*/
public class TestOperator07 {
public static void main(String[] args){
int score = 90;
String a = score<60?"不及格":"及格";
System.out.println(a);
if (score<60){
a ="不及格";
}else {
a = "及格";
}
int x = -100;
int flag = x >0 ? 1: (x == 0 ? 0 : -1);
System.out.println(flag); //结果是:-1
}
}
执行结果:
运算符优先级问题
Note:
● 大家不需要刻意的记这些优先级,表达式里面优先使用小括号来组织!
● 逻辑与、逻辑或、逻辑非的优先级(逻辑非> 逻辑与> 逻辑或)
● a||b&&c的运算结果是:a||(b&&c),而不是(a||b)&&c
优先级问题用法:
/**
* 优先级问题的用法
*/
public class TestOperator08 {
public static void main(String[] args){
boolean s1 =true, s2=true,s3=false;
System.out.println(s1||s2&&s3); //逻辑运算符:非>与>或
//建议使用小括号组织表达式
boolean s4 = (3>1||4>3)&&(3<5);
System.out.println(s4);
}
}
执行结果: