运算符
运算符有那些?
-
算数运算符:+ ,-,*,/,%,++,--
++自加,--自减;
int a = 2; System.out.println(a);//2 int b = a++; System.out.println(b);//2,先赋值再自加 int c = ++a System.out.println(c);;//4,先自加再赋值 System.out.println(a);//4 System.out.println(++a);//5 System.out.println(a);//5
-
赋值运算符 =
-
关系运算符:>, <, ==, !=, >=, <=
返回结果:布尔值:true,false;
-
逻辑运算符:&&与,||或,!非,这里会涉及到一个短路操作,就比如false&&true,这个看到第一个false他就不会再去看后面的true了,因为结果已经确定了。
System.out.println(true&&false);//false System.out.println(true||false);//true
-
位运算符:&按位与,|按位或,~按位非,^按位异或,>>右移,<<左移
int a = 0b1010;//因为计算机只能识别二进制,所以位运算符是基于二进制的 int b = 0b0111; System.out.println(a&b);//0b0010;即十进制的2 System.out.println(a|b);//0b1111;即十进制的15 System.out.println(~a);//0b0101;即十进制的-11 System.out.println(a^b);//0b1101;即十进制的13 //位移动运算符: System.out.println(a>>2);//0b0010;即十进制的2 System.out.println(b<<1);//0b1110;即十进制的14
-
条件运算符:if, ?
-
扩展运算符:+=,-=,*=,/=,%=
-
三元运算符:语法格式:x条件?y:z;
int a = 2; System.out.println(a<5?6:8);//6
不同类型数值计算出来的结果是什么类型呢?非常重要!!!非常重要!!!
-
有double输出double;无double时,有long
-
有浮点型数值时:有double输出double,无double输出float;
-
无浮点型数值时:有long输出long,无long都会输出int。
注意:两个int运算出来得到的还是int,但是你有没有想过,比如int a = 1000000000 (十亿),int b = 1000000000 (十亿),那a×b出来的结果太大了,int范围只能到-2^31 ~ 2^31-1,一共 2^32 个值,a×b出来的结果肯定超范围了,这个时候出来的结果就不对了,内存溢出了。两个float也会有这样的情况。详情如下。
byte a = 2; short b = 4; int c = 6; long d = 8L; float e = 10F;//10.0 double f = 20;//20.0 System.out.println(a*b);//8,int类型 System.out.println(a/b);//0,int类型 System.out.println(a+b);//6,int类型 System.out.println(a-b);//-2,int类型 System.out.println(a+d);//10,long类型 System.out.println(a*d);//16,long类型 System.out.println(a+e);//12.0,float类型 System.out.println(a+f);//-2,float类型 int aa = 10_0000_0000; int bb = 2000; int cc = aa*bb; System.out.println(cc);//他会得到一个这个-1454759936,结果显然不对,说明结果内存溢出了,这就是两个int运算可能出现的问题 //那如果定义他俩相乘的结果为long呢?我们来看一下 long dd = aa*bb; System.out.println(dd);//会发现还是-1454759936,为啥呢?不是已经定义为long了吗?那是因为两个int先进行了计算,得到一个int类型的-1454759936,然后再类型转换成了long。注意区别,也就是上面的-1454759936和下面的-1454759936类型不一样,上面是int,下面是long。
2.字符串连接符:+,有String类型的计算规则是什么呢?会输出什么呢?
一旦出现字符串,以后的运算,都将作为字符串去连接,而字符串出现之前的数该怎么算怎么算。
int a = 10; int b = 20; System.out.println(a+b);//30 System.out.println("w"+a+b);//w1020,之所以输出w1020,是因为在a+b之前出现了字符串连接,那么请看下面这个 System.out.println(a+b+"w");//30w,我前面也说了,当字符串出现之前,该怎么计算怎么计算,出现之后就当字符串连接。 System.out.println(a+b+"w"+a+b);//30w1020