瞬息 电光石火、转瞬即逝

Java学习笔记-运算符与表达式

2020-12-19
Ko_teiru


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

至于为什么会这样,可以参考上面的自增自减性质

单元小结

  1. 清楚掌握JAVA中的赋值、计算、关系运算符
  2. 了解一下位的运算(完全不了解)
  3. 使用括号可以轻易的改变运算的优先级

知识共享许可协议
本作品由Ko_teiru采用知识共享署名-相同方式共享 4.0 国际许可协议进行许可。


Similar Posts

评论

传送门