《Java核心技术 卷I》学习笔记3:运算符

1 算术运算符

在Java中,使用算术运算符+-*/ 表示加、减、乘、除运算。当参与/运算的两个操作数都是整数时,表示整数乘法,结果舍去小数部分取整;否则,表示浮点除法,结果为浮点数。

%是整数的求余运算,两个操作数必须都是整数。

整数被0除会产生异常,浮点数被0除会得到无穷大或NaN结果。

在默认情况下,虚拟机允许对浮点计算的中间结果采用扩展精度,以避免溢出和提高精度,但损失了可再生性。如果想要保证可再生性,可以使用strictfp关键字,限制方法或类必须使用严格的浮点计算来生成可再生的结果。

2 数学函数与常量

Math类中,包含了各种各样的数学函数和常量,例如:

Math.sqrt(x); // 平方根
Math.pow(x, a); // x 的 a 次幂,参数和返回值都是 double 类型
Math.floorMod(x, n); // 计算和 x 模 n 同余的数,当 x 为正数时,范围为 0~n-1
Math.sin(x); // 正弦函数
Math.cos(x); // 余弦函数
Math.tan(x); // 正切函数
Math.atan(x); // 反正切函数,参数和返回值为 double 类型
Math.atan2(x, y); // 计算直角坐标系下点(x,y)在极坐标系下的极角,返回值为弧度,范围从 -π~π
Math.exp(x); // e的 x 次幂
Math.log(x); // x 的自然对数
Math.log10(x); // 以10为底的对数

Math.PI // 圆周率 π
Math.E // 自然对数的底 e

只要在源文件顶部加上下面这条代码,就可以省略类名Math

import static java.lang.Math.*;

3 数值类型之间的类型转换

下图给出了数值类型之间的合法转换。
数据类型转换

图中6条实线箭头表示无信息丢失的转换,3条虚线(方向从上到下)表示可能有精度损失的转换。

当用二元运算符连接两个值时,先要将两个操作数按上述规则转换为同一种类型,再进行计算。

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

4 强制类型转换

上面给出的9种类型转换都可以自动进行,除此之外的其他类型转换都必须使用强制类型转换显式指定。强制类型转换的语法格式是在圆括号中给出想要转换的目标类型,后面紧跟待转换的变量名。例如:

double x = 9.97;
int nx = (int)x;

将浮点类型强制转换为整型时,会截断小数部分,因此上例中nx的值为9。

如果想对浮点数进行舍入运算,可以使用Math.round方法。例如:

double x = 9.97;
int nx = (int)Math.round(x);

round方法的返回值为long类型,因此这里还需要强制类型转换。现在,nx的值为10。

5 自增与自减运算符

自增与自减运算符有前缀、后缀两种形式,这两种形式都可以使变量的值加1或减1。区别在于,当用在表达式中时,前缀形式会用加1后的值参与运算,而后缀形式使用加1之前的值参与运算。例如:

int m = 7;
int n = 7;
int a = 2 * ++m; // a 为16,m 为8
int b = 2 * n++; // b 为14,n 为8

最好不要在表达式中使用自增、自减运算符,因为这样的代码很容易让人困惑。

6 关系和boolean运算符

Java包含丰富的关系运算符,关系运算符的运算结果是boolean类型值。关系运算符有:

  • ==(判等)、!=(判断不相等)
  • >(大于)、<(小于)、>=(大于等于)、<=(小于等于)

boolean运算符有:

  • &&(逻辑与)
  • ||(逻辑或)
  • !(逻辑非)

&&||是按照“短路”方式来求值的:如果第一个操作数已经能够确定表达式的值,第二个操作数就不必计算了。

Java支持三元运算符?:,格式如下:

条件 ? 表达式1 : 表达式2

当条件为true时,表达式1的值就作为整个表达式的值,否则计算为表达式2的值。

7 位运算符

位运算符有:

  • &(按位与)
  • |(按位或)
  • ^(按位异或)
  • ~(按位取反)
  • >>(右移)、<<(左移)、>>>(右移补零)

8 运算符优先级

下表从上到下,优先级递减:

运算符结合性
[]()(方法调用),.从左向右
!(逻辑非),~(按位取反),++(自增),--(自减),new()(强制类型转换)从右向左
*/%从左向右
+-从左向右
<<(左移),>>(右移),>>>(右移补零)从左向右
<<=>>=instanceof从左向右
==(判等),!=(判断不等)从左向右
&从左向右
^从左向右
|从左向右
&&从左向右
||从左向右
?:从右向左
=+=-=*=/=%=&=|=^=<<=>>=>>>=从右向左
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值