读书笔记 JAVA编程思想 第三章 操作符

简单的打印

System.out.println()

 

操作符

有些操作符可能会改变操作数自身的值。称为“副作用”。那些能改变其操作数的操作符,最普遍的用途就是产生副作用。

几乎所有的操作符都只能操作“基本类型”,但是“=”,“==”和“!=”几乎可以操作所有的对象,String支持“+”和“+=”。

优先级

先乘除后加减,还有就是考虑括号 

赋值

赋值操作符“=”,取“右边的值”,复制给左边。右值可以是任何常量,变量或表达式,但是,左值必须是一个明确的,已经命名了的变量。就是说,必须有一个物理空间来存储右边的值

a = 4;

但是不能把任何东西赋给一个常数。常数不能作为左值。

基本数据类型的赋值,就是内容的复制。然后对对象使用“赋值”,真正操作的是对对象的引用。实际上是将“引用”进行了复制,如果c=d,对c的操作可能会影响d。 因为赋值操作使得两个对象的引用指向了同一个物理空间(对象)

 

算数操作符

一元加减操作符

 

一元减号也用于转换,而一元加号与减号相对性,但是它惟一的作用仅仅是将较小的操作符提升为int

自动递增递减

i++:后缀形式,是唯一具有 副作用的操作符。

表达式返回旧值(10).

++i:先将1与变量的值相加,将新值(11)存回变量

先将1与变量的值相加,将新值(11)存回变量

表达式返回新值(11).

选择前缀还是后缀形式:

  1. 看你期待表达式的返回值是新值还是旧值;
  2. 在不关心(don't care)表达式的返回值时,优先选用前缀++(返回新值).

原因: 如果选用后缀++, 那么表达式将返回变量的旧值,那么这一瞬间,内存将同时记录(保存)旧值和新值两个变量,其中旧值是返回后就不被使用的临时变量。但这个临时变量是不必要的,亦即“拷贝旧值的动作”以及“占用的内存”都是不必要的.  以避免不必要的拷贝和内存浪费。

 

关系操作符

关系操作符生成的是一个boolean 结果,计算的是操作数的值之间的关系。如果关系为真,生成“true”,如果为假,生成“false”。

测试对象的等价性

如果想比较所有对象的实际内容  用equals() , 但是不适用于“基本类型”。基本类型直接使用“==”和“!=”即可。

equals 是比较引用,如果是自己建的类必须覆盖 equals 方法

逻辑操作符

不可以将非布尔值,当做布尔值在逻辑表达式中用

短路

即一旦明确无误的确定整个表达式的值,就不会计算余下的部分。

如果test2(2)为false 后面的就不计算。

直接常量

int i1 = 02f
char c = 0xffff;   //max char hex value
byte b = 0x7f;    //max byte
short s = 0x7fff; // max short hex value
long n1 = 200L;
long n2 = 200l;
long n3 = 200;
float f1 = 1;
float f2 = 1F;
float f3 = 1f;
double d1 = 1d;
double d2 = 1D;

如果十六进制给出超出范围的值,会自动转换成int。并且告诉我们需要对这次赋值进行“窄化转型” 。

八进制数由前缀 0 以及后续的0~7 的数字来表示。

 

指数计数法

E 代表“10的幂次”

 

按位操作符

如果两个基本类型都是bit,会执行布尔布尔代数运算。按位操作符会对两个参数的对应为执行布尔运算,并生成一个结果。

如果输入位的某一个是1,但不全都是1,按位“异或”(^) 生成一个输出为1。按位“非” (~),也成取反操作符,他是一元操作符。    

按位操作符可以与等号(=)连用,&=,|=,^|。都合法的。

布尔类型不能执行按位“非” (避免与NOT 混淆),同时在移位表达式中不能执行布尔运算。

移位操作符

<< 左移位 地位补零。 >>“有符号”右移位 使用“符号扩展” 。

Java 中增加了“无符号”右移位>>> 使用“零扩展”,无论正负,高位插入0。

 char,byte,short 移位时会转换成int。只有数值右端低五位才有用(2 的5次方是32)。避免超过int 大小。long 的数值得到的结果也是long。此时只会用低6位,防止超过long 位数。

 

三元操作符 if-esle

字符串操作符+=和+

c++中有操作符重载,Java 中操作符重载过于复杂。如果表达式以一个字符串起头,那么后续的操作数必须是字符串。

常犯错误

注意while(x=y)  Java 编译也会防止按位与,按位或,与逻辑与,逻辑或的错误使用。

类型转换操作符 

类型转换(cast),Java会将一种数据类型自动转换成另一种。编译器在会自动对 int值 到long值得提升,但是自己做“多余的事”可以提醒我们需要留意。

Java 中类型转换较为安全,窄化转换(narrowing conversion)可能丢失信息,必须显示转换。扩展转换(widening conversion) 则不必显示类型转换。

截尾和舍入

窄化转换的时候,要注意截尾和舍入。如果浮点值转化为整型值,会对数字进行截尾。需要四舍五入,需要round()方法。

Java 没有sizeof

因为所有数据类型的大小都是相同的。

 

 

 

 

posted @ 2018-10-18 18:14  dys_QAQ  阅读(140)  评论(0编辑  收藏  举报