在警报声中学习

5-运算符

表达式与语句的区别

表达式(expression) vs 语句(statement)

  • 表达式一般都有确定的结果(值),不能构成一条能单独执行的代码(往往不能以分号结尾)
  • 语句都是可以单独执行代码,以分号结尾,多数语句没有结果

算术运算符

+,-,*,/,%,++,--

+的用法

a:加法
b:正号
c:字符串连接符

自增自减

1.自增自减符号在变量前面,变量先自增自减,再参与后续运算或者赋值

2.自增自减符号在变量后面,变量先参与运算或者赋值,再自增自减。

单独使用
放在操作数据的前面和后面效果一样。
a++或者++a效果一样。
参与操作使用
放在操作数的前面:先自增或者自减,再参与操作
int a = 10;
int b = ++a;
放在操作数的后面:先参与操作,再自增或者自减
int a = 10;
int b = a++;

赋值运算符

包括基本的赋值运算符(=)和扩展的赋值运算符(+=,-=,*=...)

=,+=,-=,*=,/=,%=等

赋值运算符的运算顺序是,自右向左的,将右边的值,赋值给左边

注:

赋值运算符组成的赋值表达式也是有结果的,结果是赋值运算符等号右边的那个值.

扩展的赋值运算符

隐含了强制类型转换,会自动强转成等号左边接收变量的数据类型

s += 1
不是等价于s = s + 1
而是等价于s = (s的数据类型)(s + 1)

注:

隐含的强转也是强转,仍然会导致数据失真

比较运算符

==,!=,>,>=,<,<=

基本数据类型和基本数据类型比较

引用数据类型和引用数据类型比较,不要夸类型比较.

对于基本数据类型而言,

  • 数值类型之间可以互相比较,比较的就是数值大小(纯粹比较数值大小)

  • 如果是布尔类型,只能和布尔类型去比较,不能和数值类型比较

  • 基本数据类型的数值类型之间的比较,有相等,不等,大于,小于等概念

  • 而布尔类型之间比较,只有相等和不等,没有大小概念.

对于引用数据类型而言:

  • 它们之间互相能够比较的前提是数据类型一致

  • 比如String就只能和String比较

  • System就只能和System比较

  • 不能跨类型比较

并且引用数据类型变量之间也没有大小概念,只有相等和不相等

逻辑运算符

&,|,^,!,&&,||

位运算符

&:有0则0
|:有1则1
^:相同则0,不同则1
~:按位取反,0变1,1变0

^的特殊用法

一个数据针对另一个数据位异或两次,该数不变

class OperatorDemo{
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        
        System.out.prinln(a ^ b ^ b);		//10
        System.out.prinln(a ^ b ^ a);		//20
    }
}

位移运算符

<< 左移:左边最高位丢弃,右边补零
>> 右移:最高位是0,左边补零,最高位是1,左边补1
>>> 无符号右移:无论最高位是0还是1,左边都补0

三目运算符

概念
三目运算符,不是很常见很常用,但是有些场景下是比较好的选择,有自己很独特的使用场景
三目(ternary)运算符,也被称之为三元运算符,即指的是需要三个操作数的运算符

(条件表达式) ? 表达式1 : 表达式2;

  • 注: 条件表达式的结果是一个布尔值

它具有以下特点:

  • 1.当条件表达式为true时,执行表达式1,否则执行表达式2。

    实际上就是if..else

  • 2.三目运算符的最大特点就是,它一定会执行一个表达式, 所以它一定会有一个结果。

  • 3.正是由于它必须执行表达式。

    而语句不能放在表达式的位置,这极大的限制了三目运算符的使用。

    这就是三目运算符的缺点

比较if...else

  • 实际上if...else可以完全覆盖三目运算符使用场景,并且if...else没有表达式的限制,它更加灵活

  • 所以在开发中,有这种选择的需求时,绝大多数情况下,都会使用if...else

  • 但是三目运算符:

    1.严格来说,它的执行效率要比if...else高

    2.语法更简洁,更优雅

综上,在能够使用三目运算符的场景下,尽量使用三目运算符(实际开发中不多见)

不能使用三目运算符,再考虑if...else(很多见)

posted @ 2023-02-27 20:48  颠三倒四不积极  阅读(61)  评论(0)    收藏  举报