Java学习笔记02
笔记全写一起显得有点累赘,按ppt的顺序一篇一篇写吧,另外不复习一下真忘了好多东西……
运算符与表达式
运算符
表达式,表达式是由操作数与运算符所组成:操作数可以是常量、变量、也可以是方法,而运算符就是数学中的运算符号,如”+”、”-“、”*“、”/”、”%”(加减乘除余)等。
System.out.println(z+100);
// z与100都是操作数 而+就是运算符
常见的运算符有:
赋值运算符
赋值运算符号 | 描述 |
---|---|
= | 赋值 |
使用例:
String cloud="sb";
一元运算符
一元运算符 | 描述 |
---|---|
+ | 正号 |
- | 符号 |
! | NOT,否 |
使用例:
boolean b=false;
int x=10;
int y=-30;
System.out.println("b="+b+", !b="+ !b); //取反
System.out.println("x="+x+", -x"+ -x); //使用负号
System.out.println("y="+y+", +y"+ +y); //使用正号
最后一行输出的值依旧是
-30
,一开始我还挺疑惑的,还去问了问网友,结果被笑话了。因为负正得负,同项为正,异项为负。算术运算符
算术运算符 | 描述 |
---|---|
+ | 加法 |
- | 减法 |
* | 乘法 |
/ | 除法 |
% | 取模(求余数) |
使用例:
int i=10;
int j=3;
System.out.println(i+"+"+j+"="+(i+j)); //加法操作 10+3=13
System.out.println(i+"-"+j+"="+(i-j)); //减法操作 10-3=7
System.out.println(i+"*"+j+"="+(i*j)); //乘法操作 10*3=30
System.out.println(i+"/"+j+"="+(i/j)); //除法操作 10/3=3
System.out.println(i+"%"+j+"="+(i%j)); //取模操作 10%3=1
自增自减运算符
自增自减运算符 | 描述 |
---|---|
++ | 自增,变量值加1 |
-- | 自减,变量值减1 |
int a=3,b=3;
int x=6,y=6;
System.out.println("a="+a); //a=3
System.out.println("a++ ="+(a++)+",a ="+a); //先计算后自增 a++=3,a=4
System.out.println("b ="+b); //b=3
System.out.println("++b ="+(++b)+",b ="+b); //先自增后计算 ++b=4,b=4
System.out.println("x ="+x); //x=6
System.out.println("x-- ="+(x--)+",x ="+x); //先计算后自增 x--6,x=5
System.out.println("y ="+y); //y=6
System.out.println("--y ="+(--y)+",y ="+y); //先自增后计算 --y=5,y=5
注意:x++/x--
的话是先计算x的值再进行输出,要想输出自增/减后的值需要再次输出一次。而++x/--x
的话是先进行自增/减,再进行计算输出值,能够直接输出自增/自减后的值,不用再次输出结果。
另外尽可能不要出现++x++--x
这种容易语义不明的代码。
逻辑运算符
逻辑运算符 | 描述 |
---|---|
& | AND,与 |
&& | 短路与 |
| | OR,或 |
|| | 短路或 |
逻辑运算符就和boolean有点关系了,因为逻辑运算符就是用来判断真假的,其中加了短路的代表如果有一个为真/假,那么立即输出一个真/假的结果,不再进行后面的判断。
- & 与:
- 要求前后几个表达式的内容都要是
true
,最终结果才会是true
。如果有一个是false
,那最终结果就是false
- 所有为真才为真,一假全假
- 要求前后几个表达式的内容都要是
- && 短路与
- 读取到一个假立马输出假,后续不进行判断
- | 或:
- 要求前后几个表达式只有一个为
true
则最终结果就是true
。如果全部是false
,最终结果才为false
- 所有为假才为假,一真全真
- 要求前后几个表达式只有一个为
- || 短路或
- 读取到一个真立即输出一个真,后续不进行判断
关于短路逻辑运算符一开始我也不太明白,虽然特性与一般的逻辑运算符没啥差。后面找了找资料可算是明白了些。
“南城的人”写的这篇文章解释了一下区别,但是一开始我也没怎么看懂。这边稍微改写一下:if((23==23)||(100/0==0)){ //计算100/0会报错 System.out.println("真"); }else{ System.out.println("假"); }
此时的输出结果为“真”,且未报错。因为短路或的特性为“一个真即输出真,后续不进行判断”。
如果我们把||
改成|
的话,输出的将会变成一段错误代码,原因是或(包括与)会对两边的值都进行一边判断,即使第一次判断已经满足了条件。然后(100/0==0)
本身算是一个BUG,因为在数学里除数不能为0,所以才会产生后续的报错。
同理:if((23==32)&&(100/0==0)){ System.out.println("真"); }else{ System.out.println("假"); }
此时输出的结果为“假”,假如这时把
&&
换成&
的话,依旧会报错,因为&
也会判断所有条件。如果换成||
依旧会出错,因为(23==32)
为false
,不满足短路或的输出条件(true)。
另外还有一篇文章也不错,是QQ天堂写的短路效应的理解,这篇可以很直观的明白短路效应。
实例:
int x,y=10; //这里是声明变量x为int形,而不是给x和y都赋值为10 还请注意
if(((x=0)==0)|| ((y=20)==20)){
System.out.println("现在y的值为:"+y); //现在y的值为:10
}
int a,b=10; //a为int形,10赋予b
if(((a=0)==0)|((b=20)==20)){
System.out.println("现在b的值为:"+b); //现在b的值为:20
}
第一段if:短路或直接判断0=0为true之后直接输出了true,便运行了下一行的输出,直接舍去了后面(y=20)
的赋值,所以y的值为一开始的10。
第二段if:或在进行了两次赋值之后判断两边的条件都为true之后才输出了true,这时两边的赋值已经完成,故此时输出的b的值为20。
括号运算符 | 描述 |
---|---|
() | 提高括号中运算符的优先级 |
和数学里表达的意思差不多,优先计算括号里的内容,不过可以小括号套着小括号
位运算符
逻辑运算符|描述
:——-:|:–:
&|按位与
| |按位或
^ | 异或
~ | 取反
<<|左位移
>>|右位移
>>>|无符号右位移
异或: 同号为0,异号为1 同号为false,异号为ture
左移右移不写了,反正是二进制操作,我也不懂,也不知道有啥用。
插一个三目(三元)运算符吧,?:
使用方法:判断条件?输出结果1:输出结果2
使用例:
int a=3,b=5;
c=a>b?a:b; //如果a>b满足,则输出结果1(a),如果不满足则输出b c为5
System.out.println(a<c?a:c); //输出结果为3
另外java还有一些简洁表达式,虽然我是不太习惯用,但多少也得了解一下是吧。
+=
:左右两个的内容相加之后再赋予左边的变量,如:
int a=3,b=3;
a+=b; //先计算a+b,再将结果赋予a
System.out.println(a); //输出6
加减乘除取模都和上面那个一样,换个符号就是了。另外特殊一点的就是自增自减了:
int a=12,b=3;
a*=b++; //先进行进行a*b,把结果赋予a。再进行b的自增,b+1
System.out.println("a="+a+",b="+b); //a=36,b=4
int x=12,y=3;
x*=++y; //先进行y的自增,y+1。再计算x*y,将结果赋予x
System.out.println("x="+x+",y="+y); //x=48,y=4
至于为什么会这样,可以参考上面的自增自减性质
单元小结
- 清楚掌握JAVA中的赋值、计算、关系运算符
- 了解一下位的运算(完全不了解)
- 使用括号可以轻易的改变运算的优先级
本作品由Ko_teiru采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。