賦值運算符目前也是只需要掌握=、+=、-=、*=、/=、%=,其它和二進制相關的內容也是到后面遇到的時候再詳細學習。賦值類的運算符包括基本賦值運算符(=)和擴展的賦值運算符(+=、-=、*=、/=、%=)。我們來看一段代碼:
public class AssignmentOperatorTest01 {
public static void main(String[] args) {
//基本的賦值運算符
int i;
i = 10;
System.out.println("i = " + i);
i = 100;
System.out.println("i = " + i);
//擴展的賦值運算符
int x = 10;
x += 1; //等同于x = x + 1
System.out.println("x = " + x); //11
int y = 10;
y -= 1; //等同于y = y - 1
System.out.println("y = " + y); //9
int z = 10;
z *= 2; //等同于z = z * 2
System.out.println("z = " + z); //20
int m = 10;
m /= 3; //等同于m = m / 3
System.out.println("m = " + m); //3
int n = 10;
n %= 3; //等同于 n = n % 3
System.out.println("n = " + n); //1
}
}
x += 1和x = x + 1真的是完全相同嗎?我們來看下面的代碼:
public class AssignmentOperatorTest02 {
public static void main(String[] args) {
byte b = 10;
//以下程序編譯報錯,編譯器提示錯誤信息為:
//Type mismatch: cannot convert from int to byte
/*
* 編譯沒有通過的原因:b是byte類型,1是int類型,根據之前講解的類型
* 轉換規則得知,byte和int混合運算最后結果是int類型,int類型的值
* 無法直接賦值給byte類型的變量b,所以編譯報錯。
*/
//b = b + 1;
b += 1; //編譯通過并可以正常運行
System.out.println("b = " + b); //11
//通過以上的測試得出:b = b + 1和b += 1是不一樣的
//那么b += 1等同于什么呢?
/*
* 實際上java對于擴展類的賦值運算符進行了特殊的處理,所有
* 的擴展賦值運算符,最終都不會改變運算的結果類型,假設前面
* 的變量是byte類型,那么后面的表達式運算之后的結果還是byte
* 類型。所以實際上b += 1等同于:
*/
b = (byte)(b + 1);
System.out.println("b = " + b); //12
b += 1000; //編譯通過,并且可以正常運行
/*
* 以上代碼實際上等同于:b = (byte)(b + 1000);
* 分析得出,顯然結果已經超出了byte類型取值范圍,所以精度一定
* 會損失,最終的結果需要對計算機二進制的原碼反碼補碼進行研究。
*/
System.out.println("b = " + b); //-12
}
}
根據以上代碼測試得出,對于擴展類的賦值運算符在運算的過程中不會改變運算的結果類型,也就是說byte b = 100; b += 1000;b變量最初是byte類型,最后的運算結果還是一個byte類型。這是一條固定的語法規則,大家記住就行了,以后在使用擴展類賦值運算符的時候要謹慎,不小心就會精度損失的。