条件运算符:
exp = condition?E1:E2 ;
属于表达式,结果也应是某个类型。在混合类型运算中,即E1与E2类型不同,可能发生widing或narrowing的类型转换。
特殊规则: E1是short,byte,char,E2是int,当int是constant时,exp类型是E1的类型;否则exp是int型。
其他类型情况,如short,long,float,double,则都选择最大长度数据类型。
char x = 'c';
System.out.print(true? x: 0);// print(char)
System.out.print(false? 0f: x);// print(float)
+运算符:
1)基本数据类型的加法运算
2)String对象的连接运算
Str + anything ——隐含将anything转换成String;
3)缩写形式 +=
E1 += E2 <=> (T)((E1) + (E2)),对于混合数据类型运算,隐含强制类型转换;
如果E1是String对象,则E2可以是anything;
当E1既不是String,也不是基本数据类型,那么+=运算不合法
扩展:1.组合赋值运算符 *= /= %= -=,当运算符是short,byte,char等integer型时,存在隐式类型转换,如
byte i; i += 0;则先将byte提升至int,然后将运算的int结果在“narrow”回byte,这种隐式转换会引发不容易发现的问题。
2. ==,!=除了是数值型比较运算符,还可以用来比较对象是不是reference identity
3. 在计算机中,整数型不是对称的,如Integer.MIN_VALUE(-231) 取负值仍为 Integer.MIN_VALUE ,任何类型的数都是有boundary(如int 都要模 232)的,overflow是wolfman,时刻要小心。
++运算符
后缀自增运算i++表达式,包含2个“变量”分别是i和tmp(i++),所以i++相当于
tmp = i;
i = i + 1;
因此 i = i++; 无论执行多少次,永远都等于i的初始值