Java中的算术运算符和生活中的算数运算基本相似。
运算符 | 运算 | 范例 | 结果 |
---|---|---|---|
+ | 正 | +3 | +3 |
- | 负 | b=4;-b; | -4 |
+ | 加 | 5+5 | 10 |
- | 减 | 6-4 | 2 |
* | 乘 | 3*4 | 12 |
/ | 除 | 5/5 | 1 |
% | 取余(模) | 5%5 | 0 |
++ | 自增(前) | a=2;b++a | a=3;b=3 |
++ | 自增(后) | a=2;b=a++ | a=3;b=2 |
– | 自减(前) | a=2;b–a | a=1;b=1 |
– | 自减(后) | a=2;b=a– | a=1;b=2 |
+ | 字符串连接 | “He”+“llo” | “Hello” |
在使用算术运算时需要注意运算两侧类型:当两侧类型不统一时,运算结果和较大类型
保持一致。
int a = 3;
int b = 5;
int c = a + b; //加法运算
c = a * b; //乘法
c = a / b; //除法运算 结果为零 注意除法运算当两侧类型统一结果仍为运算数据保持一致
c = a % b; //取模运算 ,即求a/b的余值
如果对负数取模,可以把模数负号忽略不记,如:5%-2=1。但被模数是负数就另当别论。
对于除号“/”,它的整数除和小数除是有区别的:整数之间做除法时,只保留整数部分而舍弃小数部分。
“+”除字符串相加功能外,还能把非字符串转换成字符串 。“+”运算符两侧的操作数中只要有一个String类型,一个是基本数据类型时,编译成class文件后,两个操作数就被连接成了一个新的String值:
总结:对于取模运算 m % n :
当 m 等于 n 时: m % n的结果为零。
当 m 大于 n 时: m % n的结果为 m / n 的余数。
当 m 小于 n 时: m % n的结果为 m。
自加(++)自减(–)运算
++:自加,对原有的数据进行+1(如果写在变量前表示先增加1或者减少1再使用)
–:自减,对原有的数据进行-1(如果写在变量后表示先使用再增加1或者减少1)
当在一个运算表达式中包含自加运算时,当自加符号在变量右侧时,需要先将变量的值临时保存,然后给变量空间加1
,接着用临时变量空间中的值去和其他运算符进行运算。当自加符号在变量左侧时,需要先给变量空间加1
,然后把加1后的值和其他运算符进行运算。
int a = 4;
int b;
b = a++;
System.out.println("a="+a+",b="+b);
注意:自加自减运算单独存在时,放左放右是没有区别的。
思考下题:
int i = 4;
i = i++;
System.out.println("i = "+i);
赋值运算符号:
= , +=, -=, *=, /=, %=
赋值号的功能是将赋值号右侧的结果存储到左侧的变量空间
中。
int a = 3;
int b,c,d;
b = c = d = a;// 把a的值赋值给d ,再把d的值赋值给c..b
// 注意:赋值运算符不能拆分(算术运算符+=),自动完成类型转化。
赋值号和算术运算符组合起来的混合运算符,它们即具有算术运算的特定,同时还具有赋值运算的特定。
int a = 4;
a += 3; //相当于 a = a + 3;的运算,即把a空间中的值和3进行加法运算,把和值从新存放到a空间中
注意:赋值号和算数运算符的混合运算属于一个运算符,不能拆分。并且这个符号会完成自动强转动作。
// 思考
short s = 3;
// s = s + 2; s会被提升为int ,计算的结果也是int,s为short类型。需要强转
s = (short)(s + 2);
s += 2;// 赋值运算符 会自动转化
说明:
s = s + 2//编译失败,因为s会被提升为int类型,运算后的结果还是int类型。无法赋值给short类型。
s += 2//编译通过,因为+=运算符在给s赋值时,自动完成了强转操作。
在生活中经常需要判断数据大小,相等不相等各种操作,在Java中同样也可以判断数据的大小。
比较运算符符号:
>大于 >=大于等于 <小于 <=小于等于 ==相等 !=不等
比较运算符。运算完的结果要么true,要么false。后期学习中会根据比较的结果做出相应逻辑判断。
int a = 4;
int b = 5;
boolean c ;
c = a > b;
System.out.println(b);
public static void main(String[] args) {
boolean flag;
int number01 = 45;
flag = (number01*20) > 50;
System.out.println("比较结果为:"+flag);
// 比较运算的 等于 是 "=="
}
注1:比较运算符的结果都是boolean型,也就是要么是true,要么是false。
注2:比较运算符“==”不能误写成“=” 。
当需要判断某些数据符合某个区间,比如人的年龄符合某一范围等。发现使用比较运算没法完成。Java给我们提供另外一直机制,逻辑运算。逻辑运算符用于连接布尔型表达式,在Java中不可以写成3
逻辑运算符。用来连接boolean型表达式的。
& : 与
| :或
^ : 异或。
!:非。
&& 短路与 ,即必须满足所有的条件,则返回true
|| 短路或,即只满足其中一个条件即可,则返回true
注:“&&”只要见false就执行结束
“&&”中的“短路”,如果条件为false则后面的代码不再执行
“||”只要见true就执行结束
“||”中的“短路”,如果条件为true则后面的代码不再执行
运算规律
int x = 7;
x>2 & x<5
x<2 | x>5
& :两边都为true,结果是true。否则为false。
两边只要有一个false。结果必然是false。
true & true = true;
true & false = false;
false & true = false;
false & false = false;
| :两边都为false,结果是false。否则为true。
两边只要有一个true。结果必然是true。
true | true = true;
true | false = true;
false | true = true;
false | false = false;
^ : 异或。
两边相同为false。两边不同为true。
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
!:非
非真为假,非假为真
!true = false;
“&”和“&&”的区别:单与时,左边无论真假,右边都进行运算;双与时,如果左边为真,右边参与运算,如果左边为假,那么右边不参与运算。
“|”和“||”的区别同理,双或时,左边为真,右边不参与运算。
注意:&&找到false后面的不执行,||找到true 后面的不执行。
位运算:主要说的是二进制数位运算。
& 按位与运算 ,运算原则:相同二进制数位上数值为1,结果为1,否则结果为0;
3 & 5 先把 3和5以二进制表示,再进行按位于运算:
十进制 二进制 结果(十进制)
3 00000000_00000000_00000000_00000011
5 00000000_00000000_00000000_00000101
-------------------------------------------------------------------------------------------------
& : 00000000_00000000_00000000_00000001 1
所以3 & 5等于 1.
| 按位或运算,运算原则:相同二进制数位上数值为0,结果为0,否则结果为1;
3 | 5 先把 3和5以二进制表示,再进行按位于运算:
十进制 二进制 结果(十进制)
3 00000000_00000000_00000000_00000011
5 00000000_00000000_00000000_00000101
-----------------------------------------------------------------------------------------
| : 00000000_00000000_00000000_00000111 7
所以3 | 5等于 7.
2的0次方 + 2 的1次方 + 2的2次方 = 1 + 2 + 4 = 7
^ 按位异或,运算原则:参与运算的两个数相应位相同则结果为0,异号则为1;
十进制 二进制 结果(十进制)
3 00000000_00000000_00000000_00000011
5 00000000_00000000_00000000_00000101
-----------------------------------------------------------------------------------------
^ : 00000000_00000000_00000000_00000110 6
所以3 ^ 5等于 6.
~ 按位取反,运算原则:二进制数位上0变1,1变0;
十进制 二进制 结果(十进制)
5 00000000_00000000_00000000_00000101
-----------------------------------------------------------------------------------------
- : 11111111_11111111_11111111_1111010 -6
所以~5等于 -6.
左移操作“<<”:将运算数的二进制码整体左移指定位数,左移之后的空使用“0”来补充,移出去的二进制数忽略不计。
9 << 2 :
十进制 二进制 结果(十进制)
9 00000000_00000000_00000000_00001001
-----------------------------------------------------------------------------------------
00000000_00000000_00000000_0000100100 36
所以9<<2等于 36.
规律:<<:相当于给原数乘以2的倍数
右移操作“>>”:将运算数的二进制码整体右移指定位数,右移之后的空使用“符号位”来补充。移出去的二进制数忽略不计。若是正数使用“0”补充;若是负数使用“1”补充;
9 >>2 :
十进制 二进制 结果(十进制)
9 00000000_00000000_00000000_00001001
-----------------------------------------------------------------------------------------
0000000000_00000000_00000000_00001001 2
所以9>>2等于 2.
规律:>>:相当于给原数除以2的倍数
-6 >> 2:
十进制 二进制 结果(十进制)
-6 11111111_11111111_11111111_1111010
-----------------------------------------------------------------------------------------
1111111111_11111111_11111111_1111010
所以-6>>2等于 -2.
无符号右移">>>":将运算数的二进制码整体右移指定位数,右移之后的空使用“0”来补充
需求1:最有效率运算2乘以8.通过位移运算。2<<3
需求2,对两个整数变量的值进行互换(不需要第三方变量)
// 任何一个数^一个数两次得到它本身
// 通过第三方变量的形式进行置换。
int a = 3, b = 7;
int temp = a;
a = b;
b = temp;
// 通过和的形式。有个弊端,两个数据较大,可能会超出int范围。
a = a + b;//a = 3 + 7;
b = a - b;//b = 3 + 7 - 7; b = 3;
a = a - b;//a = 3 + 7 - 3; a = 7;
// 技巧。异或。
a = a ^ b;// a = 3 ^ 7;
b = a ^ b;// b = 3 ^ 7 ^ 7;
a = a ^ b;// a = 3 ^ 7 ^ 3;