美文网首页
003 操作符

003 操作符

作者: 猿笔记 | 来源:发表于2018-11-10 00:06 被阅读1次

操作符

  • 操作符可接受一个或多个参数(即操作数),并生成一个新值
  • 副作用:操作符可能会改变操作数自身的值的情况
  • 几乎所有的操作符都只能操作基本类型
  • =、==、!=可以操作所有的对象
  • String类支持+、+=

优先级

  • 当一个表达式中存在多个操作符时,操作符的优先级就决定了各个部分的计算顺序
  • 推荐:使用括号明确的规定计算顺序

    注意:字符串和+在一起,则+表示字符串连接,会尝试将非String类型的元素转为String类型

赋值

  • 赋值使用操作符=,表示:取右边的值即右值复制到左边即左值
  • 右值可以是任何常数、变量或表达式(能生成值就行)
  • 左值必须是明确已命名的变量,即必须有一个物理空间可以存储右值
a = 4;
  • 常数不能作左值
4 = a;(错误)
  • 赋值规则
    A 基本类型:直接将内容复制,互不影响
    B 对象赋值:操作的是对象的引用,【别名现象】复制的是对象的引用,两个对象指向同一块内存
  • 将一个对象传递给方法时,也会产生别名问题
    注意:别名现象容易造成意想不到的结果

算术运算符

  • 加+、减-、乘*、除/、取模%
  • 整数除法会直接去掉结果的小数位,而不是四舍五入地圆整结果
  • 运算和赋值可以合并,比如:x += 4;


  • Random类可以生成随机数,需要设置种子;nextInt、nextFloat、nextDouble等方法,可以设置随机数的上限
  • 一元减号(-)用于转换数据的符号,一元加号(+)用于将较小类型的操作数提升为int
x = -a;
x = a * -b;

自动递增和自动递减

  • 递减操作符:--
  • 递增操作符:++
  • 前缀式:先执行运算,再生成值
++a;  --a;
  • 后缀式:先生成值,再执行运算
a++; a--;


注意:除了涉及赋值的操作符之外,递增或递减符是唯一具有“副作用”的操作符

关系操作符

  • 关系操作符生成的是一个boolean结果
  • 关系操作符计算的是操作数的值之间的关系。若关系真实,则生成true(真);若关系不真实,则生成false(假)
  • 关系操作符包括:< > <= >= == !=
  • ==、!=适用于所有的基本数据类型和所有对象,其他比较符不适用于boolean类型


  • 如果需要比较两个对象的实际内容是否相同,则必须采用equals方法(可以自定义比较规则,默认比较的是引用),该方法不适用于基本数据类型


逻辑操作符

  • 与&&、或||、非!能根据参数的逻辑关系,生成一个布尔值
  • &&:两者为true,则为true,否则为false
  • ||:有个为true,则为true,否则为false
  • !:取反



  • 与、或、非只可应用于布尔值
    注意:不可将一个非布尔值当作布尔值在逻辑表达式中使用
  • 如果在使用String值的地方使用了布尔值,那么布尔值会自动转换成适当的文本形式
  • 短路现象:一旦能够明确无误地确定整个表达式的值,就不再计算表达式余下的部分了

直接常量

  • 直接常量后面的后缀字符标志了它的类型
  • 大写或小写的L,代表long => 不建议使用小写l,容易混淆
  • 大写或小写的F,代表float
  • 大写或小写的D,代表double
  • 十六进制数以前缀0x或0X开头,后面跟0~9或小写(大写)的a~f
  • 八进制数以前缀0开头,后面跟0~7
  • 二进制数没有直接常量表示方法
  • Integer、Long类的静态方法toBinaryString可以输出二进制形式的字符串;对于较小的类型会自动提升为int
  • 指数记数法:E或e表示10


  • 如果编译器能正确地识别类型,则不必在数值后附加字符。比如:long n3 = 200;但float f4 = 2.00;会出错,因为默认浮点数当作double类型

按位操作符

  • 按位操作符用来操作整数基本数据类型中的单个比特即二进制位
  • 按位操作符会对两个参数对应的位执行布尔代数运算,并最终生成一个结果
  • 按位与&:两个为1,则生成1,否则为0
  • 按位或|:有个为1,则生成1,否则为0
  • 按位异或:对应位不同,则为1,对应位相同,则为0
  • 按位非~:按位取反
    注意:区分按位操作逻辑操作
  • 按位操作符可与=组合使用,比如:&= |= ^= 但无~=
  • 布尔类型可以作为单比特值对待,可执行按位与、按位或、按位异或,但不能执行按位非
public static void main(String args[]) {    boolean b1 = true;    boolean b2 = false;    int i1 = 1;    int i2 = 0;    System.out.println(b1);    System.out.println(b2);    System.out.println(b1&b2);//false    System.out.println(b1|b2);//true    System.out.println(b1^b2);//true    //error System.out.println(~b1);    //error int can not & with boolean System.out.println(b1&i1);}
  • 按位操作符不能中途短路
  • 在移位表达式中,不能使用布尔运算

移位操作符

  • 移位操作符操作的运算对象是二进制的位
  • 移位操作符只可用来处理整数类型
  • 左移位操作符<<:按照操作符右边指定的位数将操作符左边的操作数向左移动(低位补0
  • “有符号”右移位操作符>>:按照操作符右边指定的位数将操作符左边的操作数向右移动(若符号为正,则高位插入0;若符号为负,则高位插入1
    注意:最高位表示符号:0 为正 1为负
  • “无符号” 右移位操作符>>>:按照操作符右边指定的位数将操作符左边的操作数向右移动(无论正负,高位插入0
  • 对于char、byte或short进行移位时,在移位前会被转换为int类型,并得到一个int类型的值
  • 对于char、byte、short、int进行移位操作,移位操作符的右值不能超过低5位(2^5-1,为31),因为int类型只有32位,不允许全部移位所有的位
    =》对于long进行移位操作,移位操作符的右值不能超过低6位
  • 移位操作符可以和等号组合使用;比如:<<= >>= >>>= 会将移位后的结果赋值给左边的变量
    注意:byte、char可能结果不正确,因为将int结果转换为byte、char做的是窄转换
  • 数字的二进制表示形式称为:有符号的二进制补码
    • 原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值
    • 反码的表示方法是:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反
    • 补码的表示方法是:正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1。 (即在反码的基础上+1)


条件操作符

  • boolean-exp?value0:value1 若boolean-exp为true,则计算value0,否则计算value1
int test = boolean-exp?value0:value1 

等价于

int test = 0;
if(boolean-exp){
  test = value0;
}else{
  test = value1;
}

字符串操作符+和+=

  • +、+=用于连接不同的字符串
  • 如果表达式以一个字符串起头,那么后续所有操作数都必须是字符串类型
  • 编译器会把和字符串连接在一起的其他数据类型自动转换成字符串



常犯错误

  • 错误一:对表达式如何计算有点不确定,但又不愿意使用括号
  • 错误二:= 和 == 用错
    While(x = y){//x、y都为布尔值,则不会报错导致隐藏的错误
    }
  • 错误三:&& 与 &、|| 与 |使用混淆

类型转换

  • 类型转换:将一种数据类型自动转换为另一种
  • 三种类型:
    • 隐式类型转换:=>扩展转换
byte by = 1;
int test = by;
    • 显示类型转换:
byte by = 1;
int test = (int)by;
    • 强制类型转换=>窄化转换
byte by = 1;
int test = 3;
by = (byte)test;

  • 布尔型不允许类型转换
  • 类不允许类型转换,但类族之间可以
  • 将float和double转换为整型值时,会对数字进行截尾;若想得到舍入的结果,需要使用java.lang.Math的round()
  • 类型比int小的,运算前会自动转换为int
  • 通常,表达式中出现的最大的数据类型决定了表达式最终结果的数据类型
  • Java不需要考虑移植问题,所有数据类型在所有机器中的大小都是相同的,所以不需要sizeof操作符
  • 如果对两个很大的int值执行乘法运算,结果可能溢出

重点注意:窄化转换丢失 和 溢出

相关文章

  • 003 操作符

    操作符 操作符可接受一个或多个参数(即操作数),并生成一个新值 副作用:操作符可能会改变操作数自身的值的情况 几乎...

  • Rxjava2-二、操作符

    Rxjava记录总结操作符:创建操作符、转换操作符、合并操作符、过滤操作符、其他操作符、条件操作符. 创建操作符 ...

  • Kotlin 笔记(二)集合和函数操作符

    总数操作符 过滤操作符 映射操作符 元素操作符 生产操作符 顺序操作符

  • 走进RxJava源码(三) -- 创建型操作符

    创建型操作符 create操作符 just操作符 fromArray操作符 empty操作符 range 操作符

  • RxJava2操作符

    操作符分类 操作符分类有十三种: 变换操作符 过滤操作符列表 组合操作符 错误处理操作符 辅助操作符 条件操作符 ...

  • js运算符与表达式

    操作符 一元操作符:++,-- 算术操作符:+,-,*,/,% 关系操作符:>,<,>=,<= 相等操作符:==,...

  • 操作符和表达式

    操作符 一元操作符(++,--) 算术操作符(+,-,*,/,%) 关系操作符(>,<,>=,<=,) 相等操作符...

  • Rxjava讲解(2)

    上面文章讲过创建操作符, 转换操作符,过滤操作符, 这篇文字介绍组合操作符,条件操作符,功能操作符。 组合操作符 ...

  • JavaScript高程读书笔记(2)

    五、操作符 算数操作符、位操作符、关系操作符、 相等操作符 一元操作符++和--:注意a+++,- 位操作符按位非...

  • rxjava2 学习笔记

    特点 链式调用 线程切换 操作符 创建操作符 转换操作符 过滤操作符 组合操作符 错误处理操作符 辅助性操作符 条...

网友评论

      本文标题:003 操作符

      本文链接:https://www.haomeiwen.com/subject/xbksoftx.html