复合赋值操作符包括*=、/=、%=、+=、-=、<<=、>>=、>>>=、&=、^=和|=。

这种操作可能会自动地执行窄化原始类型转换,如

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类型的变量之上使用复合赋值操作符。因为这样的表达式执行的是混合类型算术运算,它容易造成混乱。更糟的是,它们执行将隐式地执行会丢失信息的窄化转型,其结果是灾难性的。