Java学习day005 运算符

使用的教材是java核心技术卷1,我将跟着这本书的章节同时配合视频资源来进行学习基础java知识

day005  运算符


运算符

在Java中,使用算术运算符+、-、*、/表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数除法;否则,表示浮点除法。整数的求余操作(有时称为取模)用%表示。例如,15/2等于7,15%2等于1,15.0/2等于7.50。需要注意,整数被0除将会产生一个异常,而浮点数被0除将会得到无穷大或NaN结果(上一节有介绍)。


  • 数学函数与常量

    • 在Math类中,包含了各种各样的数学函数。在编写不同类别的程序时,可能需要的函数也不同。
    • 要想计算一个数值的平方根,可以使用sqrt方法:
    • double x = 4;
      double y = Math.sqrt(x);
      System.out.println(y);
    • 结果如下:

    • 在 Java中,没有幂运算,因此需要借助于 Math类的 pow方法。语句:

    • double y = Math.pow(x,a);
    • 将y的值设置为x的a次幂(xa)。pow方法有两个double类型的参数,其返回结果也为double类型。
    • Math类提供了一些常用的三角函数:
      • Math.sin
      • Math.cos
      • Math.tan
      • Math.atan
      • Math.atan2
    • 还有指数函数以及它的反函数—自然对数以及以10为底的对数:
      • Math.exp
      • Math.log
      • Math.log10
    • 最后,Java 还提供了两个用于表示 pai和 e 常量的近似值:
      • Math.PI
      • Math.E
    • 不必在数学方法名和常量名前添加前缀“Math”,只要在源文件的顶部加上下面这行代码就可以了。
    • import static java.lang.Math.*;

 


  • 数值类型之间的转换

    • 经常需要将一种数值类型转换为另一种数值类型。下图给出了数值类型之间的合法转换。有6个实心箭头,表示无信息丢失的转换;有3个虚箭头,表示可能有精度损失的转换。例如,123456789是一个大整数,它所包含的位数比float类型所能够表达的位数多。当将这个整型数值转换为float类型时,将会得到同样大小的结果,但却失去了一定的精度。
    • int n = 123456789;
      float f = n;
      //f is 1.23456792E8

       

    • 当使用上面两个数值进行二元操作时(例如n+f,n是整数,f是浮点数),先要将两个操作数转换为同一种类型,然后再进行计算。

    • 有以下的转换规则:
      • 如果两个操作数中有一个是double类型,另一个操作数就会转换为double类型。
      • 否则,如果其中一个操作数是float类型,另一个操作数将会转换为float类型。
      • 否则,如果其中一个操作数是long类型,另一个操作数将会转换为long类型。
      • 否则,两个操作数都将被转换为int类型。

  • 强制类型转换

    • 在上面看到,在必要的时候,int类型的值将会自动地转换为double类型。但另一方面,有时也需要将double转换成int。在Java中,允许进行这种数值之间的类型转换。当然,有可能会丢失一些信息。在这种情况下,需要通过强制类型转换(cast)实现这个操作。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。例如:
      double x = 9.997;
      int nx = (int)x;
      //nx = 9

       

    • 强制类型转换通过截断小数部分将浮点值转换为整型。如果想对浮点数进行舍人运算,以便得到最接近的整数(在很多情况下,这种操作更有用),那就需要使用Math_round方法:
      double x = 9.997;
      int nx = (int)Math.round(x);
      // nx = 10

       

    • 当调用round的时候,仍然需要使用强制类型转换(int)。其原因是round方法返回的结果为long类型,由于存在信息丢失的可能性,所以只有使用显式的强制类型转换才能够将long类型转换成int类型。
    • 需要注意的是:如果试图将一个数值从一种类型强制转换为另一种类型,而又超出了目标类型的表示范围,结果就会截断成一个完全不同的值。例如,(byte)300的实际值为44。

  • 结合赋值和运算符

    • 可以在赋值中使用二元运算符,这是一种很方便的简写形式。例如: x+=4;等价于:x=x+4;
    • 一般地,要把运算符放在=号左边,如*=或%=;
    • 如果运算符得到一个值,其类型与左侧操作数的类型不同,就会发生强制类型转换。

  • 自增与自减运符

    • 在Java中,借鉴了C和C++的做法,也提供了自增、自减运算符:n++将变量n的当前值加1,n--则将n的值减1。
    • 上面介绍的是运算符放在操作数后面的“后缀”形式。还有一种“前缀”形式:++n。后缀和前缀形式都会使变量值加1或减1。但用在表达式中时,二者就有区别了。前缀形式会先完成加1;而后缀形式会使用变量原来的值。
      int m = 7;
      int n = 7;
      int a = 2 * ++m;  //a=16,m=8
      int b = 2 * n++;  //b=1,n=8

       

    • 建议不要在表达式中使用++,因为这样的代码很容易让人闲惑,而且会带来烦人的bug。

  • 关系和boolean运算符

    • Java包含丰富的关系运算符:要检测相等性,可以使用两个等号=。例如,3=7的值为false。
    • 另外可以使用!=检测不相等。例如3!=7的值为true。
    • 还有经常使用的<(小于)、>(大于)、<=(小于等于)和>=(大于等于)运算符。
    • Java沿用了C++的做法,使用&&表示逻辑“与”运算符,使用丨丨表示逻辑“或”运算符。感叹号!就是逻辑非运算符。&&和丨|运算符是按照“短路”方式来求值的:如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。
    • Java支持三元操作符?:,这个操作符有时很有用。如果条件为true,表达式condition?expression1:expression2,就为第一个表达式的值,否则计算为第二个表达式的值。例如:
    • x<y?x:y 会返回x和y中较小的一个。如果x<y条件成立,返回x的值。如果条件不成立,则返回y的值。

  • 位运算符

    • 处理整型类型时,可以直接对组成整型数值的各个位完成操作。这意味着可以使用掩码技术得到整数中的各个位。位运算符包括:&("and") |("or")^("XOr") ~("not")。这些运算符按位模式处理。
    • 例如如果n是一个整数变量,而且用二进制表示的n从右边数第4位为1,则int fourthBitFromRight=(n&0b1000)/0bl000;会返回1,否则返回0。利用&并结合使用适当的2的幂,可以把其他位掩掉,而只保留其中的某一位。
    • 另外,还有>>和<<运算符将位模式左移或右移。需要建立位模式来完成位掩码时,这两个运算符会很方便:例如,1<<35的值等同于1>>3或8。
    • >>>运算符会用0填充高位,这与>>不同,它会用符号位填充高位。不存在<<<运算符。

  • 括号与运算符级别

    •  下表是运算符的优先级。如果不使用圆括号,就按照给出的运算符优先级次序进行计算。同一个级别的运算符按照从左到右的次序进行计算(除了表中给出的右结合运算符外。)例如,由于&&的优先级比||的优先级高,所以表达式a&&b||c等价于(a&&b)||c。又因为+=是右结合运算符,所以表达式a+=b+=c等价于a+=(b+=c)也就是将b+=c的结果(加上c之后的b)加到a上。

  • 枚举类型

    • 有时候,变量的取值只在一个有限的集合内。例如:销售的服装或比萨饼只有小、中、大和超大这四种尺寸。当然,可以将这些尺寸分别编码为1、2、3、4或S、M、L、X。但这样存在着一定的隐患。在变量中很可能保存的是一个错误的值(如0或m)。
    • 针对这种情况,可以自定义枚举类型。枚举类型包括有限个命名的值。例如:
    • enum Size{S,M,L,E,L}
    • 现在,可以声明这种类型的变量:
    • Sizes=Size.M;
    • Size类型的变量只能存储这个类型声明中给定的某个枚举值,或者null值,null表示这个变量没有设置任何值。
    • 后面还会详细介绍枚举类型的内容。

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值