复合赋值操作符包括*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=和|=。
这种操作可能会自动地执行窄化原始类型转换,如
short ori = –1;
ori>>>=1; 表示的真实含义是先将ori进行符号扩展成int, 再进行无符号右移1位,然后窄化类型转换成short。
以下循环将无限执行
short ori = -1;
while(ori != 0){
ori >>>= 1;
}
使用byte声明也一样。char声明则因为char是无符号的,进行无符号扩展成int, 是有限循环。
语句若不使用复合赋值操作符,而使用
short ori = -1;ori = ori >>>1;
则无法通过编译;需要显式Cast: ori = (short)(ori>>1);
Java解惑:总之,不要在short、byte或char类型的变量之上使用复合赋值操作符。因为这样的表达式执行的是混合类型算术运算,它容易造成混乱。更糟的是,它们执行将隐式地执行会丢失信息的窄化转型,其结果是灾难性的。
转载于:https://blog.51cto.com/dongdong1314/391722