------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
Java基础语法之运算符
运算符分类:算数运算符、赋值运算符、比较运算符、逻辑运算符、位运算符,三元运算符
算数运算符:
运算符 运算 范例 结果
+ 正号 +3 3
- 负号 b=4;a=-b a=-4
+ 加号 5+5 10
- 减号 6-4 2
* 乘号 3*4 12
/ 除 8/2 4
% 取余数 5%4 1
++ 自增 a=2;b=++a a=3;b=3(a先自增再赋值)
++ 自增 a=2;b=a++ a=3;b=2(a先赋值再自增)
-- 自减 a=2;b=--a a=1;b=1(a先自减再赋值)
-- 自减 a=2;b=a-- a=1;b=2(a先赋值再自减)
+ 字符串相加 “aa”+”bb” “aabb”
(运算顺序跟数学算术一样,先乘除再加减,有括号先算括号)
例一:
class TestDemo{
public static void main(String[] arg){
System.out.println(6+5/3);
}
}
打印结果为
7//整数与整数相除,5/3只保留整数部分
例二:
class TestDemo{
public static void main(String[] arg){
System.out.println(5%2);
System.out.println(-5%2);
System.out.println(5%-2);
System.out.println(-5%-2);
}
}
结果
1
-1
1
-1
负数对正数(或负数)去模结果为负
正数对正数(或负数)去模结果为正
除数为零的运算
当除数与被除数都为整数,且除数为零时,例如:
int a =7,b=0
a/b与a%b都会出现异常
而当被除数与除数都为浮点类型时,且除数为0时,例如:
float a=7,b=0.0f(或者 double a=7,b=0.0)
/b与a%b都不会出现异常,但返回值为NaN(表示Not a Number)或者Infinity(表示正无穷大,-Infinity表示负无穷大),这两个是float与double的封装类的常量,其中NaN不等于任何值。
自己测试下
自增的陷阱
例子
class TestDemo{
public static void main(String[] arg){
short a =0;
a=a++;
System.out.println(a);}}
打印结果为
0
这里是因为a=a++的运算顺序:在赋值与自增前,a存入一个临时变量中temp=a;然后a自增a=a+1,然后进行赋值运算,把临时变量存入a,a=temp;所以a=0;
赋值运算符
运算符 说明 范例 结果
= 把右边值赋值给左边 a=4;b=a a=4,b=4
+= 左边值加上右边值的和赋值给左边 a=4;a+=2 a=6
-= 左边值减去右边值的和赋值给左边 a=4;a-=2 a=2
*= 左边值乘以右边值的和赋值给左边 a=4;a*=2 a=8
/= 左边值除以右边值的和赋值给左边 a=4;a/=2 a=2
%= 左边值对右边值去模赋值给左边 a=6;a%=4 a=2
a=a+4与a+=4有所不同
程序一:
class TestDemo{
public static void main(String[] arg){
short a =8;
a+=4;
System.out.println(a);//结果为12}}
程序二:
class TestDemo{
public static void main(String[] arg){
short a =8;
a=a+4;
System.out.println(a);}}
结果出现编译错误:
TestDemo.java:4: 错误: 不兼容的类型: 从int转换到short可能会有损失
a=a+4;
^
1 个错误
原因:执行s+=4;时。编译器自动把short类型的变量a转为int类型再参与运算,然后把int类型结果强制转换为short;而s=s+4;编译器不进行强制转换。所以int类型结果赋值给short类型出现错误。
赋值顺序:
先运算左边赋值,再运算右边赋值,再把右边赋值给左边;
比较运算符
运算符 运算 范例 结果
== 相等于 4==3; false
!= 不等于 4!=3; true
< 小于 4<3; false
> 大于 4>3; true
<= 小于等于 4<=3; false
>= 大于等于 4>=3; true
Instanceof 是否类的对象 “hello” instanceof String true
比较运算符得出的结果都boolean型,要么true要么false
逻辑运算符
运算符 运算 范例 结果
& and(与) alse&true false(两边条件都为true,结果才true)
&& and(短路与) false&&true false(只要前面条件为false,就不判断后面条件)
| or(或) false|true true(其中一边或者两边都为true,结果就true)
|| or(短路或) false||true true (只要前面条件为true,就不判断后面条件)
^ XOR(异或) false^true false(两边相同为false)
! Not(非) !false true(true变false,false变true)
例题:
&和&&(|和||)的区别
两者运算结果都是一样的,但运算过程有所不同
&:无论左边的运算结果是什么,右边都参与运算。
&&:当左边为false时,右边不参加运算,这样可以提升效率。(|和||同理)
小程序
class TestDemo
{
public static void main(String[] args)
{ int a =6,b=8;
System.out.println(a>b&a==b++);
System.out.println(a);
System.out.println(b);
System.out.println(a>b&&a==b++);
System.out.println(a);
System.out.println(b);
}
}
打印结果:
false
6
9
false
6
9
结论,&&运算比较符,左边为fasle时,右边就不运算
位运算符
运算符 运算 范例
<< 左移 3<<2=12(3*2*2=12)【0011<<2-----1100】补0
>> 右移 7>>2=1(7/2/2=1只保留整数部分)【0111>>2----0001】最高 位为1就补1,最高位为0就补0
>>> 无符号右移 同>>,不同点在于不管最高位1或0,最高位都补0
& 与运算 6&3=2【0110&0011=0010】
| 或运算 6|3=7【0110|0011=0111】
^ 异或运算 6^3=5【0110^0011=0101】
~ 反码 ~6=-7【~0000 0000 0000 0000 0000 0000 0000 0110=
1111 1111 1111 1111 1111 1111 1111 1001】
负数为正数的反码+1
一个数异或同一个数两次,结果还是这个数,例如:
可以利用这个规律进行对数据加密,把数据异或某固定值再保存,打开时再异或同样的值解密。
利用异或交换变量:
int n=6,m=9;
n=n^m;
m=n^m;
n=n^m;
System.out.println(n+”...”+m);
三元运算符
格式:
(条件表达式)?表达式1:表达式2;
如果条件为true,运算后的结果是表达式1;
如果条件为false,运算后的结果是表达式2。
例子:
class TestDemo
{
public static void main(String[] args)
{
int n=6,m=9;
System.out.println((n>=m)?n:m);
}
}
结果为
9
表达式:就是具有一定语法规则的语句。
需要注意的是:使用三元运算符表达式进行判断,必须要有返回值,跟if语句有所不同