加(+) 減(-)乘(*)除(/)求餘(%)
- 加、減、乘什麼都不用說,和數學上的一樣。
- 除需要注意:當參與
/
運算的兩個操作數都是整數時,表示整數除法(結果爲整數);否則,表示浮點除法(結果爲浮點數)。如: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類中應該有現成的方法(以此類推,在進行一些常規操作時,要有意識去想一下有沒有內置的函數可以使用)。
- 要熟練並且習慣使用三目運算符,會使代碼整潔、簡練、好看。
- 不要太在意運算符的優先級,適當使用括號(但當遇到問題時,應該能夠想一想是不是優先級的問題)。
捐贈
若你感覺讀到這篇文章對你有啓發,能引起你的思考。請不要吝嗇你的錢包,你的任何打賞或者捐贈都是對我莫大的鼓勵。