智渔课堂官方免费教程五:Java基础之运算符

时间:2021-12-26 19:25:59

一、运算符


一、按运算类型分为

算术运算符

用于数值类型之间的数学运算,结果也为数值类型
byte a = 15;
byte b = 10;

运算符 含义 实例 结果
+ 加法 a + b 和:25
- 减法 a - b 差:5
* 乘法 a * b 积:150
/ 除法 a / b 商:1
% 取余 a % b 余数:5
++ 自增1 a++:先取出变量a的值参与其他运算,再执行自增1
++a:先执行自增1,再取出变量a的值参与其他运算
//先取出a的值赋值给c,在执行a自增1;结果:c的值是15,a的值是16
int c = a++;
//重新给a赋值为15
a = 15;
//先执行a自增1之后a的值为16,在取出a的值赋值给d,所以d的值也是16
int d = ++a;
-- 自减1 a--:先取出变量a的值参与其他运算,再执行自减1
--a: 先执行自减1,再取出变量a的值参与其他运算
同上


       如果参与数学运算的数据类型,是小于或等于int类型中的任意几种类型参与运算,得到的结果都是int类型的,如果有大于int类型的数据类型参与运算,其结果的数据类型就是表达式中最大的数据类型。



实例:/**
* 演示算术运算
* @author学霸联盟-赵灿
*/
public class ArithmeticOperationDemo {
public static void main(String[] args) {
//声明一个byte类型的变量a,并赋值为10
byte a = 10;
//声明一个short类型的变量b,并赋值为15
short b = 15;
//使用变量a和b进行加法运算,其结果为int类型
//如果要将结果赋值给byte类型的变量,就必须进行强制类型转换,否则会出错
byte c = (byte) (a + b);
//声明一个double类型的变量d,并赋值为1
double d = 1;
//运算表达式中最大的数据类型是double,所以结果的数据类型也是double
//现在声明int类型的变量i接受表达式的结果,就必须进行强制类型转换
int i = (int) (c + d);
}
}


关系运算符

用于数值类型之间的比较,得到的结果为布尔类型


运算符 含义 实例 结果
> 大于 boolean b = (1>2) b的值为false
小于 boolean b = (1<2) b的值为true
>= 大于等于   boolean b = (1>=2) b的值为false
<= 小于等于 boolean b = (1<=2) b的值为true
== 等于 boolean b = (1==2) b的值为false
!= 不等于 boolean b = (1!=2)     b的值为true


逻辑运算符

操作数为boolean类型的数据上;得到的结果也是boolean类型;

boolean  a = false;
boolean  b = false;
boolean  c = true;
boolean  d = true;


运算符 含义 实例 结果
&& 或 & 逻辑与 a&&b 结果为false
a&&c结果为false
c&&b结果为false
c&&d 结果为true
两个操作数同时为true时,结果为true;任意一个操作数为false,结果就为false
|| 或  | 逻辑或 a||b 结果为false
a||c结果为false
c||b结果为false
c||d 结果为true
两个操作数同时为false的时候,结果才为false;有任意一个为true,结果就为true
! 逻辑非 !a结果为true
!c结果为false
只有一个操作数,操作数放在符号右边
操作数为true,结果为false;操作数为false,结果为true
^ 逻辑异或 a^b结果为false
a^c结果为true
两个操作数相同,结果为false
两个操作数不同,结果为true

&&和&:都是逻辑与;

||和|:都是逻辑或;

他们的使用方式一样,得到的结果也一样

但是&& 和 || :具有短路功能;
       &&:左边的操作数为false时,就已经可以确定表达式的结果一定为false了,所以就不会在执行右边的操作了
       ||:左边的操作数为true时,就已经可以确定表达式的结果为true了,所以就不会执行右边的操作了

这里涉及到流程控制,下一篇文章再演示这个问题


位运算符(这里涉及到二进制的知识较多,初学者可以选看)

      位运算符是将整形数据值转换成二进制的补码,将二进制补码靠右对齐(二进制位数少的在左侧补0),对齐位上的值进行运算,运算后得到的二进制是结果的补码,将结果的补码转换成二进制原码,再将二进制原码转换成十进制值

      在java语言中,一个有符号的整型数据的二进制最左侧的一个二进制位(最高位)被用来代表这个值的正负号(0代表正号,1代表负号)

那么如何将十进制转换成二进制呢?

      例:十进制的13转换成二进制

            13/ 2 商6 余1

            6 / 2 商3余0

            3 / 2 商1余1

            1 / 2 商0余1

      得到的余数倒序排列,所有十进制的13转换成二进制的结果为1101


二进制转换成十进制

      例:二进制的1101转换成十进制

             取出最右边一位的值是1,乘以基数2(基数:几进制基数就是几)的0次方

             取出右边第二位的值是0,乘以基数2的1次方

            取出右边第三位的值是1,乘以基数2的2次方

            取出右边第四位的值是1,乘以基数2的3次方

            如果还有更多位,依次进行同上的运算,然后将上面运算的结果相加;(1×20)+ (0×21)+(1×22)+ (1×23) 结果为13


二进制的三种码制

      原码:通过对其他进制的数值转换获得

      反码:符号位不变,其他位取反

      补码:反码+1

      正数的原码、反码、补码相同,不需要计算

      例:byte b = -6;

      byte类型的长度为8位

      所以b的二进制原码为10000110;其中最高位(最左侧)为1,代表这是一个负数,右侧所有位代表值

      反码为:11111001(符号位不变,其他位取反)

      补码为:11111010(二进制逢二进一)


位运算符的操作数只能是整型数据或char类型数据,结果为整型数据

运算符 含义 实例 结果
& 按位与 1&1结果为1
1&0结果为0
0&0结果为0
如果两边都是1,结果为1
任意一边为0,结果就为0
| 按位或 1|1结果为1
1|0结果为1
0|0结果为0
如果两边都是0,结果为0
任意一边为1,结果为1
~ 按位取反 ~0结果为1
~1结果为0
只有一个操作数,在符号的右侧
如果当前位为1,结果为0
反之,则为1
^ 按位异或 1^1结果为0
0^0结果为0
1^0结果为1
两边相同,结果为0
两边不同,结果为1
<< 有符号左移 操作数 << 移动的位数 符号位不动,其他位依次向左移动,移动之后的空缺位补0
>> 有符号右移 操作数 >> 移动的位数 符号位不动,其他位依次向右移动,移动之后的空缺位补最高位
>>> 无符号右移 操作数 >>> 移动的位数 符号位和其他位一起向右移动,移动之后最高位补0

首先要注意:为运算会将小于int类型自动转换成int类型来运行,运算结果为int类型。所以运算时是32位二进制。
实例:将13向左移动1位(13<<1);先将13转换成二进制1101(正数符号位为0,这里就简写成4位了),正数的原码反码补码相同,所以直接移动即可,每一位依次左移一位,最后补一个0,结果是11010,转换到十进制为26
           将13向右移动1位(13>>1);结果是110,最右边的1被移除了,转换到十进制为6
           正数的最高位为0,所以无符号和有符号的右移结果一样
           有符号左移:int或long类型转换成二进制后,只要左边第二位上不为1,结果就是原值乘以2;如果第二位上为1,在左移时,这个1会被移除,所以结果不是乘2
           有符号右移:就是除以2;
                                 但要注意-1有符号右移任意多位,结果仍然为-1。这是因为计算机是使用补码进行运算的。
                                 原码:10000001(简写为8位,实际应该是32位)
                                 反码:11111110(符号位不动,其他位按位取反)
                                 补码:11111111(反码+1)
                   位移后的补码:11111111(最右边的1被移除,在左边第二位上补最高位,负数的最高位是1,所以位移后结果未发生变化)
                          结果反码:11111110(补码-1)
                          结果原码:10000001(-1)
           无符号右移:原值为正数,结果为原值除以2;但要注意负数的无符号右移。
                         例:-1>>>1
                     补码:11111111111111111111111111111111(32位1)
      位移后的补码:01111111111111111111111111111111(注意:这里是连同符号位一起位移,位移后最高位补0;补0后就变成了一个正数,正数的原码反码补码相同,所以这是一个非常大的正数)



赋值运算符

单一赋值运算符:=

复合算术赋值运算符:+=  -=  *= /=  %=

复合位赋值运算符:&=  |=  ^= <<=  >>=  >>>=

复合赋值运算符中间不能有空格;注意没有~=

常量名或变量名 = 常量值或另一个变量或运算表达式

将=右边的值,存储到左边的变量或常量中;需要使用时,使用左边的变量名或常量名获取值

如:int a = 10; int b = a; int c = a+b;都可以;结果是a和b的值都为10;c的值为20

运算符 含义 实例 结果
= 赋值 int  i = 10; 变量i的值是10
+= 加后赋值 a+=b等价于a=a+b a的值为25,b的值不变
-= 减后赋值 a-=b等价于a=a-b 先运算减法,在运算赋值操作
*= 乘后赋值 同上 同上
/= 除后赋值 同上 同上
%= 取余后赋值 同上 同上
&= 按位与后赋值 同上 同上
|= 按位或后赋值 同上 同上
^= 按位异或后赋值 同上 同上
<<= 左移后赋值 同上 同上
>>= 右移后赋值 同上 同上
>>>= 无符号右移后赋值 同上 同上

 

条件运算符:?:

运算符 含义 实例 结果
? : 布尔表达式?结果1:结果2 5>6 ? “对” : “错” 先进行5>6的比较运算,得到的结果是字符串类型的值:“错”
如果布尔表达式的结果为true;整个表达式结果为:结果1;反之,结果为:结果2

注意:如果结果出现了不同的类型,接收这个表达式的值时,必须是能够存储两种结果类型的数据类型

例:byte  b = 1;

long i= 2;

//虽然此处result得到的结果是变量b的值,但是result不能声明成byte类型的,要声明称long类型;如果result声明成比long类型小的类型,需要对结果进行强制类型转换

int result = b<i ? b : i ;

 

字符串连接符:+

只要表达式中出现了一个字符串,运算时从左向右运算,从第一个出现的字符串开始,将其后的所有其他类型的值转换成字符串,并将各个字符串连接到一起

例:"字符串1"+"字符串2" 的结果为:"字符串1字符串2"

"字符串" + 1 + 2 的结果为: "字符串12"

1+ 2 + "字符串" 的结果为: "3字符串"

二、按操作数的个数分类

       只需要一个操作数的运算符,一元运算符,单目运算符

       需要两个操作数的运算符,二元运算符,双目运算符

       需要三个操作数的运算符,三元运算符,三目运算符


二、Java的基本语句

表达式语句

   表达式是由常量、变量、方法调用和运算符组合起来的式子

例如:

//声明表达式

int a

//赋值表达式

a = 10

//算术运算表达式

a++

给这些表达式加上一个英文格式的分号,就是表达式语句

例如:

//声明语句:意义是声明了一个int类型的变量a

int a;

//赋值语句:意义是给变量a赋值为10

a = 10;

//自增语句:意义是给变量a自身增加1

a++;

空语句

只有一个英文格式的分号组成的语句叫空语句

//空语句

;

复合语句

    将任意多种类语句的一条或多条语句用大括号{}括起来形成一个整体,这个整体(含大括号)称复合语句,java中也称为代码块。

例如:

{

int a = 10;

a++;

int b = a+10;

boolean bool = a>10;

System.out.print(a);

}

           原码:10001101(简写为8位,实际应该是32位)

           反码:11110010(符号位不动,其他位按位取反)

           补码:11110011(反码+1)