最基本的操作为赋值操作,= 即赋值操作符
基本的算术操作为加、减、乘、除取模、除取余数,其对应操作符为 +、-、*、/、%
算术操作与赋值操作联合衍生为:+=;-=;*=;/=;%=;
由于处理器硬件的不同,浮点数在进行除法时会出现结果不一致的情况,为了解决此情况,在方法前加 strictfp 关键字,可以使此方法的严格进行浮点除操作,从而产生理想的结果。 例如:
public static strictfp void main(String[] args)
3.5.1 数学函数操作与数学常量
在Java中要使用各种数学函数和数学常量 可以使用 Math 类(java.lang.Math 默认加载),例如:
double x = 4;double y = Math.sqrt(x);System.out.println(y); // prints 2.0
Math.pow Math.expMath.logMath.log10Math.sinMath.cosMath.tanMath.atan
Math.PIMath.E
floodMod 方法旨在解决长时间以来的整数除法产生的余数问题。思考这么一个表达式: n%2 ,每个人都知道,如果n是偶数,那么结果为0,入股n是偶数,那么结果为1,此外,如果n是负数,结果确实 -1,为什么呢?因为,在计算机产生之初,必须有个人必须为整数除数与余数建立被除数是负数的规则。数学家们早已有了最佳方案:余数必须≥0.但是,这些计算机先驱提出了一种看似合理,但是很不方便的解决方法。
想一下这个问题。你已经计算出了钟表里时针的位置(position),钟表有个延时(adjustmet),现在是几点,很简单
(position + adjustment) % 12
但是如果 延时是 负数,那么结果很可能是个负数,你要么引入一个新学科,要么使用
((position + adjustment) % 12 + 12) % 12
每种方法都有争议,floodMod解决了这个问题,floorMod(position + adjustment, 12)直接给出0-11的结果(不幸的是,如果除数是负数,则会给出负数结果,这种情况在实际中并不经常发生)。
public class Test{ public static void main(String[] args){ System.out.print( "-3/2 = "+ -3/2 +"%" + -3%2 ); }}
结果为
Compiling Test.java.......-----------OUTPUT------------3/2 = -1%-1[Finished in 6.4s]
此处理解可能有误差,贴原文如下:
The floorMod method aims to solve a long-standing problem with integer remainders.
Consider the expression n % 2 . Everyone knows that this is 0 if n is even and 1 if nis odd. Except, of course, when n is negative. Then it is -1 . Why? When the firstcomputers were built, someone had to make rules for how integer division and
remainder should work for negative operands. Mathematicians had known the
optimal (or “Euclidean”) rule for a few hundred years: always leave the remainder≥ 0. But, rather than open a math textbook, those pioneers came up with rulesthat seemed reasonable but are actually inconvenient.
3.5.2 数值类型转换
下图为8种基本内置类型(其实没有boolean类型)合法(默认、自动)的转换
虚线表示有精度损失。自动转换优先级为 double-float-long-int
3.5.3 造型运算符(强制类型转换)(Casts)
在上节中可见,int在需要时会自动转换为double,但是有时却需要double转换为int。Java允许这种转换,但是有精度损失。这时就用到了强制类型转换。
double x = 9.997;int nx = (int) x;
nx值为9,小数部分截断。如果相对小数部分进行舍入,使用下列方法
double x = 9.997;int nx = (int) Math.round(x);
nx值为10.
不要对boolean类型进行强制类型转换,会发生未知错误,如果实在要用,使用下列方法
b ? 1 : 0
3.5.4 带操作符的赋值
x+=4; 等价于 x=x+4 ;
如果x是int,x+=3.5 也是合法的。相当于将x赋值为(int)(x + 3.5)。
3.5.5 自增自减操作符
int m = 7;int n = 7;int a = 2 * ++m; // now a is 16, m is 8int b = 2 * n++; // now b is 14, n is 8
m=++n ;相当于 n++;m=n;m=n++;相当于 m=n; n++;
3.5.6 关系操作符与布尔操作符
Java中包含各种关系操作符,包括
像==,!=,>,<,<=,>=等的逻辑判断操作符
像&&,|| 的逻辑运算操作符
特殊的 condition ? expression 1 : expression 2 操作符
3.5.7 位操作符
& ("and") | ("or") ^ ("xor") ~ ("not")
<< 按位循环左移,一般32位一次循环,long型 64位一次循环,一般按位取模后进行移位,比如 1<<32 实际根本没有进行移位操作,1<<33 只操作了一次
>> 按位右移,高位补符号位,算术右移,取模后移位
>>> 按位循环右移,高位补0,逻辑右移,取模后移位
没有<<<,
注:在c/c++中不可确定>>是逻辑移位还是算术移位,看编译器。只能在正数中使用
3.5.8 运算符优先级
操作符 | 结合性 |
[] . () (method call) | |
! ~ ++ -- + (unary) - (unary) () (cast) new | 左 |
* / % | |
+ - | |
<< >> >>> | |
< <= > >= instanceof | |
== != | |
& | |
^ | |
| | |
&& | |
|| | |
?: | 左 |
= += -= *= /= %= &= |= ^= <<= >>= >>>= | 左 |
java中没有 , 操作符,不过可以在for循环中使用以分隔语句。 也没有sizeof()。
3.5.9 枚举类型(在操作符这章居然混入类型,其实使用时是一种自定义类型的操作,类似于class 与 c中的结构体,java中没有结构体)
enum Size { SMALL, MEDIUM, LARGE, EXTRA_LARGE };
默认初始化值为 null ,只能赋值为已经定义的枚举值与null
定义时各个选项值从1开始,直至用户自定义再开始。
第5章 详细讨论