运算符
一、算数运算符
二元算术运算符主要用于进行基本的算术运算,如加法、减法、乘法、除法等。遵从优先级
public class Demo01 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
int d = 40;
//加减乘除 +、-、*、/
System.out.println(a+b);//Ctrl+d复制到下一行
System.out.println(a-b);
System.out.println(a*b);
System.out.println(a/b);//输出为零,但实际上应该是0.5,四舍五入向下取整了。
System.out.println(a/(double)b);//强转
//取余 %
int h = 21;
//取余,模运算
System.out.println(h%c);//h/c == 21/10 = 2...1 %取余数的意思
}
}
一元运算符 ++自增、–自减
public static void main(String[] args) {
//一元运算符
int a= 3;//初始值
int b = a++;//a++ a = a + 1 ,执行完这行代码后,先给b赋值,在自增
//a = a + 1
System.out.println(a);//结果:4
//a = a + 1
int c = ++a;//执行完这行代码后,先自增,在给c赋值
int d = a--;//a-- a = a - 1 ,执行完这行代码后,先给d赋值,在自减
//a = a - 1
System.out.println(d);//结果:5
//a = a - 1
int f = --a;//执行完这行代码后,先自减,在给f赋值
System.out.println(f);//结果:3
//++(自增) :一元运算符
System.out.println(a);//结果:3 这里最后输出的a是赋值后的f
System.out.println(b);//结果:3
System.out.println(c);//结果:5
//--(自减) :一元运算符
System.out.println(a);//结果:3 这里最后输出的a是赋值后的f
System.out.println(d);//结果:5
System.out.println(f);//结果:3
//总结:a++ 先赋值在自增,++a 先自增在赋值 a--/--a 同理
//幂运算 2^3 = 2*2*2 = 8 java中没有2^3的运算,需要借助工具类
//很多运算我们会使用一些工具类来操作!
//ctrl+alt点击math可以查看工具
double pow = Math.pow(2,3);//=2^3
System.out.println(pow);
}
}
三元运算符 x ? y : z
public class Demo08 {
//三元运算符
public static void main(String[] args) {
//x ? y : z
//如果x的值是真的(x==true),则结果为y,否则结果为z
int score = 80;
//String type 是定义变量
String type = score <60 ? "不及格" : "及格";
System.out.println(score);
}
二、赋值运算符
public class Demo02 {
//算数运算符
public static void main(String[] args) {
long a = 1212121231213l;
int b = 123;
short c = 10;
byte d = 8;
double s = 3.14;
//多个操作数中,有一个操作数为long,结果类型也为long
//如果操作数为double和long,结果类型为double
//没有long的时候,结果都为int,无论你是不是有int操作
System.out.println(a+b+c+d);//结果类型:long
System.out.println(b+c+d);//结果类型:int
System.out.println(c+d);//结果类型:int
//Inconvertible types; cannot cast(转换) 'int' to 'java.lang.String'
// System.out.println((String)(c+d));//不能把int类型转化为String
System.out.println(s+a);//结果类型:double
System.out.println((long) s+a);//强转为long
//Inconvertible types; cannot cast(转换) 'int' to 'java.lang.String'
// System.out.println((String)(s+b));//不能把double类型转化为String
//总结:自动升为混合运算类型中最高类型, byte、short、char用运算符运算后自动转型为int类型
}
}
三、关系运算符
public class Demo03 {
public static void main(String[] args) {
//关系运算符返回的结果:正确/错误 通过布尔值来表示
int a = 10;
int b = 20;
System.out.println(a>b);//大于 false
System.out.println(a<b);//小于 true
System.out.println(a==b);//等于 false
System.out.println(a!=b);//不等于 true
}
}
四、逻辑运算符
//逻辑运算符
public class Demo05 {
public static void main(String[] args) {
// 与(and):&& 或(or):|| 非(取反):!(&&)
boolean a = true;
boolean b = false;
/* System.out.println("a&&b:"+(a&&b));//逻辑与&&运算:变量两个为真,结果才为true
System.out.println("a||b:"+(a||b));//逻辑或||运算:两个变量有一个为真,则结果才为true
System.out.println("!(a&&b):"+!(a&&b));//如果是真,则变为假,如果是假,则变为真
*/
//短路运算
int c = 5;//c=6
boolean d = (c++<4)&&(c<4);//第一个值是正确的,所以执行,但是后面错误输出false
//false
boolean e = (c<4)&&(c++<4);//先判断先前条件,正确就往下执行,不正确就停止输出false
System.out.println(c);//c=6
System.out.println(d);//false
System.out.println(e);//false
int z = 5;//z=7
boolean x = (z++>4)||(z<4);//一个为真就是true
boolean v = (z<4)||(z++<4);//false
System.out.println(z);
System.out.println(x);
System.out.println(v);
int m = 6;
boolean y = !(m++<4);
boolean o = !(m++<4);
System.out.println(y);
System.out.println(o);
}
}
五、位运算符
public class Demo06 {
//位运算
/* A = 0011 1100
// B = 0000 1101
与 A&B = 0000 1100 如果两个都是1,才为1。否则都是0
或 A|B = 0011 1101 如归对位是是1,直接是1,两都是0,才为0
异或 A&B = 0011 0001 如果两个位置相同,则为0,否则为1
取反 ~B = 1111 0010 如果两个都是1,才为0。否则都是1
题目 2*8 = 18 2*2*2*2
效率高
<<左移 *2 >>右移 /2 箭头指向哪边就往哪移
二进制
0000 0000 0
0000 0001 1
0000 0010 2
0000 0011 3
0000 0100 4
0000 0110 5
0000 1000 8
0001 0000 16
*/
public static void main(String[] args) {
System.out.println(2<<3);
}
}
六、赋值算符
public class Demo07 {
public static void main(String[] args) {
int a = 10;
int b = 20;
int c = 30;
int d = 60;
a+=b;//a = a+b
a-=b;//a = a-b
a*=b;//a = a*b
a/=b;//a = a/b
System.out.println(a);
//字符串链接符 + ,在链接符两侧只要有一方出现String类型,就会把其他操作数转换成String类型
System.out.println(""+a+b);//字符串在前面,就会出现拼接
System.out.println(a+b+"");//字符串在后面,前面的数依旧会进行运算
}
}
六、优先级
所有的数学运算都认为是从左向右运算的,Java 语言中大部分运算符也是从左向右结合的,只有单目运算符、赋值运算符和三目运算符例外,其中,单目运算符、赋值运算符和三目运算符是从右向左结合的,也就是从右向左运算。
乘法和加法是两个可结合的运算,也就是说,这两个运算符左右两边的操作数可以互换位置而不会影响结果。运算符有不同的优先级,所谓优先级就是在表达式运算中的运算顺序。
一般而言,单目运算符优先级较高,赋值运算符优先级较低。算术运算符优先级较高,关系和逻辑运算符优先级较低。多数运算符具有左结合性,单目运算符、三目运算符、赋值运算符具有右结合性。