一、运算符
一、按运算类型分为
算术运算符
用于数值类型之间的数学运算,结果也为数值类型
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)