【java基礎(八)】運算符

加(+) 減(-)乘(*)除(/)求餘(%)

  • 加、減、乘什麼都不用說,和數學上的一樣。
  • 除需要注意:當參與/運算的兩個操作數都是整數時,表示整數除法(結果爲整數);否則,表示浮點除法(結果爲浮點數)。如:12 / 2 = 7; 15.0 / 2 = 7.5;
  • 注意:整數被0除將會產生一個異常,浮點數被0除將會得到無窮大或NaN結果。
  • 整數的求餘操作(有時稱爲取模),用%表示。就是兩個數相除後的餘數。
  • 看例子:
// 運算符 實例
public class Operator {

	public static void main(String[] args) {
		// 定義變量
		int a = 15;
		int b = 2;
		System.out.println(a + " + " + b + " = " + (a + b)); // 加
		System.out.println(a + " - " + b + " = " + (a - b)); // 減
		System.out.println(a + " * " + b + " = " + (a * b)); // 乘
		System.out.println(a + " / " + b + " = " + (a / b)); // 除
		System.out.println("15.0 / 2 = " + (15.0 / 2)); // 浮點除法
		System.out.println(a + " % " + b + " = " + (a % b)); // 求餘(取模)
		// System.out.println("1 / 0 = " + (1 / 0));  // 將會產生異常
		System.out.println("1/0 / 0 = " + (1.0 / 0)); // 無窮大
	}

}

去掉註釋後的異常信息:

數學函數

在Java的內置Math類中,包含了各種各樣的數學函數。

調用方法:Math.方法名(參數);

  • 平方跟(sqrt)。
		// 平方根
		double x = 4;
		double y = Math.sqrt(x);
		System.out.println(y);

  • 冪運算(pow)。
		// 冪運算
		System.out.println(Math.pow(2, 3)); // 2的3次冪

  • 三角函數
    • Math.sin
    • Math.cos
    • Math.tan
    • Math.atan
    • Math.atan2
  • 指數函數和反函數
    • Math.exp
    • Math.log
    • Math.log10
  • 兩個常量
    • Math.PI 表示圓周率π
    • Math.E 表示e常量
  • 這些函數沒有必要死記硬背,只要知道有,常用的知道怎麼用,需要用到的時候能想到Math類即可。

數值類型之間的轉換

在平時的編程中會經常有意或者無意(無意的時候更多)將一種數值類型轉換爲另一種數值類型。

  • 在類型轉換的時候,在數值範圍大的類型轉換爲數值範圍小的類型的時候,有可能會造成數據信息丟失的情況(因爲小的數值類型着不下那麼大的數字)。
		// 數值類型之間的轉換,丟失信息的情況
		int n = 123_456_789;
		float f = n;
		System.out.println(f);

  • 在進行二元(兩個數)數值運算的時候,需要先將兩個數轉換爲同一種類型(自動轉或人工轉)再進行計算。轉換規則如下:
    • 如果兩個操作數中有一個是double類型,另一個操作數就會轉換爲double類型。
    • 否則,如果其中一個操作數是float類型,另一個操作數將會轉換爲float類型。
    • 否則,如果其中一個操作數是long類型,另一個操作數將會轉換爲long類型。
    • 否則,兩個操作數都將會轉換爲int類型。
  • 數值類型的轉換可以用下面的圖表示,實心箭頭表示無信息丟失的轉換,虛心箭頭表示可能有精度損失的轉換。

強制類型轉換

在數值類型之間的轉換中可以看到,在必要的時候,int類型的值會自動的轉換爲double類型。但有些時候,我們需要將double轉換成int,在Java中,這種數值之間的轉換是允許強制進行的。

  • 這個時候我們需要使用**強制類型轉換(cast)**實現這個操作。

強制類型轉換的語法格式是在圓括號中給出想要轉換的目標類型,後面緊跟着待轉換的變量名。

(想要轉換的目標類型)待轉換的變量名;

如:

		// 強制類型轉換
		double x = 9.997;
		int nx = (int)x;
		System.out.println(nx); // double強制轉換爲int後丟失精度

  • 這裏我們將9.997強制轉換爲int,得到的結果是9,因爲強制類型轉換是通過截斷小數部分將浮點值轉換爲整型。如果根據我們的習慣要得到四捨五入的結果該怎麼辦呢?(思考3秒鐘),對了,要想到Math類肯定會有這樣的函數可以直接使用(自己查一下吧)。

結合賦值和運算符

我們經常會對變量本身進行運算操作,這個時候使用結合運算符就會很方便和精煉。

結合運算符賦值:將運算符放在=號的左邊,聯合構成一個運算符。

如:我們需要將變量x本身加4,常規寫法:x = x + 4;結合運算符寫法:x += 4。相比較一下,品一品。

同樣的+=-=*=/=都是可以的。

注意:如果運算符左側操作數的數值類型與右側的不通,就會發生強制類型轉換。如int x = 1; x += 3.5;,等同於x = (int)(x + 3.5);

如:

		// 結合賦值和運算符
		int x = 1;
		x += 4;
		System.out.println(x);
		x += 3.5; // 這裏會發生強制類型轉換 等同於 x = (int)(x + 3.5)
		System.out.println(x);

自增與自減運算符

在編程的過程中,尤其在遍歷集合的時候,加1、減1是數值變量最常見的操作。這也是爲什麼會有自增自減的運算符。

後綴模式:n++:將變量n的當前值加1,n–:將變量n的當前值減1。

前綴模式:++n:將變量n的當前值加1,–n:將變量n的當前值減1。

乍一看,後綴模式和前綴模式的效果一樣,但兩者是有區別的。

  • 前綴模式會先完成加1;後綴模式會使用變量原來的值,再加1。
  • 注意觀察實例,細品:
		// 自增 自減運算符
		int a = 1;
		int b = 1;
		System.out.println(a++);
		System.out.println(a);
		System.out.println(++b);
		System.out.println(b);

  • 有些人建議不要使用自增、自減運算符,因爲易讀性不好。但我不這樣認爲,自增、自減運算符的簡練會讓代碼很好看。

關係運算符

  • 相等:==
  • 不等:!=
  • 小於:<
  • 大於:>
  • 小於等於:<=
  • 大於等於:>=

邏輯運算符

  • 邏輯“與”:&&
  • 邏輯“或”:||
  • 邏輯“非”:!
  • !=運算符可以看出來!就是邏輯非的意思。
  • &&||是按照短路方式求值的:如果第一個操作數能確定表達式的值,第二個操作數就不必計算了。
    • 對於&&:如果第一個表達式爲false,第二個表達式就不必計算了。
    • 對於||:如果第一個表達式爲true,第二個表達式就不必計算了。
		// 邏輯運算符
		int x = 1;
		if (x != 0 && x++ == 2)	// 這裏的x++被執行了
			;
		System.out.println(x);
		x = 1;
		if (x != 1 && x++ == 2)	// 這裏的x++沒有被執行
			;
		System.out.println(x);

三目運算符

condition ? expression1 : expression2;

這個就是三目運算符的樣例(三目就是這個運算符涉及到3個表達式)。

如果條件的結果是true,結果就是第一個表達式的值,否則結果爲第二個表達式的值。

		// 三目運算符
		int x = 1;
		int y = 2;
		int z = x > y ? x : y;	// 通過三目運算符獲取x.y中較大的數
		System.out.println(z);

位運算符

太複雜了,有興趣的自行先學習。

運算符優先級

下圖爲運算符的優先級圖,如果不使用括號,就按照給出的運算符優先級次序進行(注意結合性)。

運算符 結合性
[].()(方法調用) 左 -> 右
! ~ ++ – + - ()new(強制類型轉換) 右 -> 左
* / % 左 -> 右
+ - 左 -> 右
<< >> >>> 左 -> 右
< <= > >= instanceof 左 -> 右
== != 左 -> 右
& 左 -> 右
^ 左 -> 右
| 左 -> 右
&& 左 -> 右
|| 左 -> 右
? : 右 -> 左
= += -= *= /= %= &= |= ^= <<= >>= >>>= 右 -> 左
  • 因爲+=是右結合運算符,所以a += b += c;等價於a += (b += c)。
  • 運算符的優先級不需要死記硬背,實在搞不清楚的時候就多用一些括號即可。

運算符中需要注意的點

  • 要留意無意的類型轉換,有非常的多。
  • 要學會並且習慣使用結合運算符(+=-=)。
  • 熟練使用自增、自減,不排斥,並且要有編程習慣,比如單行語句中不使用變量自增、自減後的值的時候,均寫成x--的形式,只有在語句中需要使用變量值時才考慮使用x--還是--x
  • 在做一些數學計算時,常用的計算方法一定要有意識的認爲Math類中應該有現成的方法(以此類推,在進行一些常規操作時,要有意識去想一下有沒有內置的函數可以使用)。
  • 要熟練並且習慣使用三目運算符,會使代碼整潔、簡練、好看。
  • 不要太在意運算符的優先級,適當使用括號(但當遇到問題時,應該能夠想一想是不是優先級的問題)。

捐贈

若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章