大家好,我叫何先振,今天给大家讲解下Java的语法和运算符。
1.算术运算符可分为:正号+、负号-、加+、减-、乘*、除/、取模%、前++、后++、前--、后--、连接符+。
除号/,要特别注意,我们定义了int类型的变量相除,得到的也是整数,这时候会出现丢失小数。如果要想保留,需要转成double相除。比如:丢失小数,int除以int类型会是int类型。
不丢失小数,有两种方式:
方式一:num2+0.0自动转换成了double类型,double类型跟num1相除,得到也是double类型。因此没有损失小数,这是上讲说的自动类型提升。
方式二:num1直接转成double类型,跟num2相除,最后自动转型成double类型,也没有损失小数。两种方式都可以。
% 取余数运算,取余结果时,被除数为正,余数为正,被除数为负,余数为负。开发中经常会用来判断是否可以被除尽的情况。
前++、后++,的区别是:前++:先自增1,后运算。后++:先运算,后自增1。
如图:num5++ 先赋值给了num6,在自增,因此num6是12,num5是13。++num4是先自增,再赋值。因此num4是13,后面赋值给num7也是13。
注意点:之前说过,byte、short、char运算,都需要整数int类型接收,但是这种方式自增1时,是不会改变变量的类型的。
由于127是byte正数最大范围,+1的话,位最高位从0变成1,最高位代表的是正负,所以变成了-128。这可以说明这种自增方式,不会改变变量类型。
前--、后--的区别:前--:先减1,后运算。后--:先运算,后减1。以上跟上面加法效果一样,区别只不过是这里做减法,减1。
2.赋值运算符符号:=,将等号右边的值,赋给左边的变量。可以支持连续赋值:
两个变量,共用一个类型,连续赋值。
赋值运算的扩展:+=、-=、*=、/=、%=表示,在本身的变量上的值,+一个数,-一个数,*一个数,/一个数,%取余赋值给自己。本身值为19,加上2位,为21,如图:
本身为21,除以5,取余为1,将余数赋值给变量自身。如图:
注意:这种赋值也不会改变变量类型。
3.比较运算符(关系运算符)比较运算符的结果,都是布尔类型的值,要么是true,要么是false。
可分为:==相等于、!=不等于、<小于、>大于、<=小于等于、>=大于等于、instanceof(这个后面会讲)。如图:2和13,==号比较不相等,返回false,12小于或者等于13,返回true。
4.逻辑运算符逻辑运算符可以分为:& 逻辑与运算符、|逻辑或运算符、!逻辑非运算符、&&短路与运算符、||短路或运算符、^逻辑异或运算符。
逻辑运算符,都是跟布尔类型的变量做运算。逻辑运算符的结果,都是布尔类型的值,要么是true,要么是false。如下:
&&和&当两个都为true的时候才为true,有一个为false,都为false。
||和|当两个有一个为true时就为true,都是false时才为false。
!a,a为false时,非a就为true,a为true时,非a就为false。
a^b,异或两个相同时为false,不同时为true。
(1)短路与&&和逻辑与&的区别:短路与做逻辑运算时,发现一个能够决定整个的逻辑结果时,就不会运算第二个。逻辑与还会继续运算第二个。比如 a1=false 、b1=true。a1 && b1时,a1为false我就知道整个必为false,所以没必要在运行下去,直接终止。
a1&b1时,a1为false,不死心,还会继续运行b1,直到把两个都运行完,才结束。因此图中,num10在短路与中没有自增,因为根本就没运行这段代码。
相同点结果相同,当符号左边是true都会执行右边的运算。
不同点,当符号左边是false时短路与不会执行右边的运行,逻辑与会继续执行右边的运算。
(2)短路或||和逻辑或|的区别:跟短路与和逻辑与相似,短路或做逻辑运算时,发现一个能够决定整个的逻辑结果时,就不会运算第二个。逻辑或还会继续运算第二个。比如 a1=true、b1=false。a1 || b1时,a1为true我就知道整个必为true,所以没必要在运行下去,直接终止。a1|b1时,a1为true,不死心,还会继续运行b1,直到把两个都运行完,才结束。
相同点结果相同,当符号左边是false都会执行右边的运算。
不同点,当符号左边是true时短路或不会执行右边的运行,逻辑或会继续执行右边的运算。
开发中,推荐使用短路或跟与。因为他能够减少不必要的运行。
5.位运算符 位运算符操作的都是整形型的变量。在一定范围内,<<左移,每移动一位,相当于乘以2。<<左移,表示十进制的数,换算成二进制,字节位中集体移动多少位。移动多出来右边的部分用0补位,比如2<<2,0000 0010变成了0000 1000 变成了8。如果a<
如图:22左移动2为,22*4=88,22右移动1为,22/2=11
&与运算,两个数的二进制比较,0代表false,1代表true,只要有一个false,就为0。2:0000 0010 ,6:0000 0110 比较得到:0000 0010 还是2,如图:
|或运算,两个数的二进制比较,0代表false,1代表true,只要有一个true,就为1。2:0000 0010 ,6:0000 0110 比较得到:0000 0110 还是6。如图:
^异或运算,两个数的二进制比较,0代表false,1代表true,只要两个不一样,就为true。2:0000 0010 ,6:0000 0110 比较得到:0000 0100 就为4,如图:
~取反运算,就是二进制位值取反,1变0,0变1。2:0000 0010 ,取反:~2:1111,1101 变为-3 就是反码。
这里要区分这些符号,跟逻辑运算符很像,逻辑运算符比较的是boolean类型的。如果看到是整数类型的这些符号就是做位运算。
6.三元运算符(条件表达式)?表达式1:表达式2 :如果条件表达式为true的话就执行表达式1,如果是false的话就执行表达式2,执行的结果可以用统一的类型去接收。
三元运算符可以嵌套使用,如图:
下讲我们会讲到流程控制语句,凡是可以写成三元运算符的,都可以写成if-else控制语句。
凡是可以写成if-else控制语句,不一定都能写成三元运算符。如果都可以写成,推荐优先使用三元运算符,因为代码效率高。
7.运算符的优先级如果想让运算符优先运行,就直接加(),都会先运行括号里面的。具体优先级,可参考这个表格:
以上就是今天的内容介绍,下期我们来讲Java基础语法之流程控制,欢迎长期关注学习更多Java知识。



