黑马程序员——Java基础语法 之运算符
2015-10-19 00:16
253 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------
算数运算符:
运算符
运算 范例 结果
+
正号 +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”
(运算顺序跟数学算术一样,先乘除再加减,有括号先算括号)
例一:
打印结果为
7//整数与整数相除,5/3只保留整数部分
例二:
结果
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不等于任何值。
自己测试下
自增的陷阱
例子
打印结果为
0
这里是因为a=a++的运算顺序:在赋值与自增前,a存入一个临时变量中temp=a;然后a自增a=a+1,然后进行赋值运算,把临时变量存入a,a=temp;所以a=0
4000
;
赋值运算符
运算符
说明 范例 结果
=
把右边值赋值给左边 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有所不同
程序一:
程序二:
结果出现编译错误:
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时,右边不参加运算,这样可以提升效率。(|和||同理)
小程序
打印结果:
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语句有所不同
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
4000
;
赋值运算符
运算符
说明 范例 结果
=
把右边值赋值给左边 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语句有所不同
相关文章推荐
- 程序员永远不要再犯的5个编程bug
- 程序员的逗比瞬间(第三季)
- “码农”岂是你们叫的?
- 程序员遇到bug的30种反应
- 黑马程序员 Java基础难点总结day1
- 黑马程序员——Java堆栈区别
- 给Android程序员的一些面试建议
- 面试经验-网易游戏测试工程师全天面试笔记
- java程序员基本技能
- java架构师之路:JAVA程序员必看的15本书的电子版下载地址
- 面试经验-记中兴通讯测试岗两次面试
- 深受Java程序员欢迎的10款Java IDE
- 程序员法则
- 软件测试职业发展方向
- 黑马程序员——Blocks
- Android应用开发---面试题
- 黑马程序员——protocol简单使用
- 115个Java面试题和答案——终极列表(下)
- 115个Java面试题和答案——终极列表(上)
- 黑马程序员——内存管理