操作符(Operator)
也稱為運算符,比如 + - * / 這些符號都是操作符
表達式(Expression)
是一個由數(shù)值和操作符組成的式子。把
所有的變量的值代入表達式,計算出的最終的值,稱為表達式的
值。
算術操作符
操作符 名稱 作用
+ 加 加法運算
- 減 減法運算
* 乘 乘法運算
/ 除 除法運算
% 模 模運算
整型的算術運算
假定在以下式子中,a,b 為 int 型。
a + b 求和
a - b 求差
a * b 求積
a / b 求商 (結果不保留小數(shù))
a % b 求余
規(guī)定兩個 int 型在算術運算后,結果仍為 int 型。運算規(guī)則和小
學算術基本一樣,下面只需要解釋一下除法和模運算
(1) 整型的除法運算,結果舍去小數(shù)部分
(2) 整型的模運算,結果為余數(shù)
浮點型的算術運算
對于小數(shù)的算術運算,規(guī)則也是類似的。重點在于它的除法和模運算
(1) 浮點型的除法運算,結果保留小數(shù)部分
(2) 浮點型的模運算,結果為余數(shù)
類型提升
int a = 14; double b = 5.0; System.out.println( "結果為: " + ( a / b) );
規(guī)定:當 int 型與 double 型混合運算時,把 int 型視為 double型,稱為類型的提升
這是因為,double 型是可以兼容整數(shù)的表示的,所以都提升為double 型來運算比較好,不會丟失數(shù)據(jù)。所以,上式 a/b 的結果
按 double/double 來進行,結果為 2.8。
混合運算與優(yōu)先級
當一個式子中包含多種符號時,需要考慮優(yōu)先級問題
a* b + c / d
在這個式子里有 3 種運算符:乘、加、除。那么,在運算的時候,誰先執(zhí)行、誰后執(zhí)行是一個要考慮的問題。和直觀理解的一致,
乘、除的優(yōu)先級是略高于加的
在 Java 里規(guī)定了
* 和 / 的優(yōu)先級要高于 + ,所以才有了上面的結果。
關系操作符
操作符 名稱
< 小于
<= 小于或等于
> 大于
>= 大于或等于
== 等于
!= 不等于
關系操作符的運算
對于關系表達式,只需要把相應的值代入式子,從邏輯上判斷一下。
如果是成立的,則值為 true;如果不成立,則值為 false。
int a = 10; System.out.println (" 結果: " + ( a < 5) );
在 println 里的表達式最好加上小括號,以顯式地指定運算的優(yōu)先級。
注意事項
(1) 操作符是一個整體,中間不能加空格
例如 >= <= == !=
(2) 對于初學者來說,注意區(qū)分 == 和 =
編程并不是數(shù)學,不要把數(shù)學的習慣帶過來。當判斷是否相等時,要用==來判斷
邏輯操作符
操作符 名稱 作用
&& 邏輯與 并且
|| 邏輯或 或者
! 邏輯非 非
邏輯與 &&
這個操作符用于表示“并且”的關系。形式如下,
a && b
其中,a,b 均為 boolean 類型。當 a 成立并且 b 成立時,結果才成立(true)。否則,結果不成立(false)。
通俗地講,就是表示日常生活中“并且”的邏輯。比如,一件事情需要 a,b 同時在場才能處理,那就是并且的關系。
邏輯或 ||
這個操作符用于表示“或者”的關系。形式如下,
a || b
當 a 成立或者成立時,結果成立(true)。否則,結果不成立(false)。
通俗地講,就是表示日常生活中“或者”的邏輯。比如,一件事情 a,b 均能處理,則只要 a 在場或者 b 在場即可,這就是或者的關系
邏輯非 !
邏輯非表示“否”。
!a
其中,如果 a 為 true,則結果為 false; 如果 a 為 false,則結果為 true。
注意事項
(1) 操作符是一個整體,中間不能加空格
例如 && ||
(2) 操作符與操作數(shù)之間,可以加空格
比如,! k 也可以
賦值操作符
在 Java 語言里,等號稱為賦值操作符。例如,
a = b + 100;
其中,不要把 Java 語言理解為數(shù)學。在 Java 里,這個等號的作用是“賦值”,就是把右側(cè)的值賦給左邊的變量。
- 等號左邊必須是變量;
- 將等號右邊表達式的值,賦給左邊的變量。
區(qū)分初始值與賦值
在定義一個變量的時候,可以指定初始值。
int a = 10;
// 定義一個變量 a,初始值為 10
int b;
// 如果未指定初始值,則初始值為 0
下面演示一下賦值操作。
int a = 10;
// 此行的等號為初始化
int b = 22;
// 此行的等號為初始化
a = b + 100;
// 此行的等號表示賦值操作
賦值操作的過程
賦值操作分為 2 步運行:
① 先計算等號右側(cè)的式子的值;
② 再把右側(cè)的值賦給左側(cè)的變量。
例如
int a = 10; a = a + 99;// 重點理解這一行的賦值操作 System.out.println("a 的值為 " + a );
來分析一下, a = a + 99 這一行是分兩步來運算的:(1) 首先,計算出右側(cè)表達式 (a+99) 的值,為 109;
(2) 然后,將右側(cè)的值賦給左側(cè)的變量,即 a=109
組合賦值操作符
賦值操作符可以和其他操作符組合起來使用
a += b; a -= b; a *= b; a /= b; a %= b;
規(guī)則都是一樣的,a+=b 相當于 a = a + b。
int a = 10; a += 12; // 相當于 a = a + 12 System.out.println("現(xiàn)在 a 為: " + a); // a 的最終值為 22
自增操作符
在 Java 語言里,++ 稱為自增操作符。
int a = 10; a++; System.out.println("現(xiàn)在 a 為: " + a);
其中,a ++ 可以理解為 a = a +1 。所以,最終 a 的值為 11
前置自增與后置自增
自增操作符有 2 種寫法,寫在前面的稱為前置自增,寫在后面叫后置自增。
后置自增:
int b = 10; a = b++ ;
后置自增時,先把 b 的值代入式子運算,之后再對 b 自
增加 1。所以,最終的結果 a 為 10, b 為 11。
前置自增:
int b = 10; a = ++b ;
前置自增時,先對 b 自增加 1,然后再代入式子運算。
前置自增與后置自增分辨起來有點燒腦,但它并不是 Java 編程的重點,所以不要在這個知識點上花太多時間。
通常為了增加代碼的可讀性,可以分成 2 行書寫。
a = b; b ++; // 分成兩行來寫,以消除可能的誤解
自減操作符
int a = 0; int b = 10; a = b --; // 先代入運算,后自減。所以 a 變成 10,b 變成 9。
再次強調(diào),++和--不是學習的重點,不要過分地研究和練習。
操作符的優(yōu)先級
當一個表達式里有多種操作符時,就需要明確操作符的優(yōu)先級順序。也就是說,哪些部分先運算,哪些部分后運算。比如,
a - b * 10 / 2
這個表達式看起來很簡單。之所以會覺得簡單,因為事先知道了算術符的優(yōu)先級。畢竟在小學時代就學過了算術運算的優(yōu)先級,乘除法的優(yōu)先級是高于加減法的
但是,當把多種 Java 操作符綜合在一起時,就不那么簡單了。
比如,
a>10 && !ok
對于這樣的式子,含有關系操作符 > 和邏輯操作符 && ! 。
要進行運算,就必須明確優(yōu)先級。在這里,關系操作符比邏輯操作符的優(yōu)先級高,而邏輯非又與邏輯與的優(yōu)先級高所以,它的運算順序是這樣的:
( ( a>10 ) && ( !ok )
然而,在 Java 語言里,操作符約有幾十種,想要記住它們的
優(yōu)先級順序是不太現(xiàn)實的,也是不必要的。并不需要強記這些優(yōu)先級,只要知道幾種常用的操作符的優(yōu)先級就足夠了。當表達式較為復雜的時候,建議多加一些小括號,用小括號來明確指定運算的先后順序
類型轉(zhuǎn)換操作符
在整型與浮點型之間,允許類型轉(zhuǎn)換。
double a = 12.77; int b = (int) a; // 將 double 類型轉(zhuǎn)成 int 類型 System.out.println("b 的值:" + b);
a 是 double 型 ,
b 是 int 型,
b = a 賦值時,要求左右兩側(cè)的類型相同。所以,可以把 a 轉(zhuǎn)換成 int 型。也就是說,一個 double 類型可以轉(zhuǎn)成 int 類型。把這對小括號稱為類型轉(zhuǎn)換操作符
反過來,一個 int 類型也可以轉(zhuǎn)換成 double 類型。
int c = 10; double d = (double) c; // 將 int 類型轉(zhuǎn)成 double 類型
類型轉(zhuǎn)換時的數(shù)據(jù)損失
在 double -> int 的轉(zhuǎn)換過程中,數(shù)據(jù)可能發(fā)生損失。
double a = 12.77; int b = (int) a; // 存在數(shù)據(jù)損失
轉(zhuǎn)換后的 b 的結果為 12,即小數(shù)部分被截斷。
反過來,在 int -> double 的轉(zhuǎn)換過程中,數(shù)據(jù)不會損失。
int c = 10; double d = (double) c; // 沒有數(shù)據(jù)損失
顯式轉(zhuǎn)換與隱式轉(zhuǎn)換
在類型轉(zhuǎn)換的過程中,如果沒有風險和數(shù)據(jù)損失,就可以把類型轉(zhuǎn)換符省略
int c = 10; double d = c; // 省略 (double) 轉(zhuǎn)換符
在 d=c 的過程中,發(fā)生了隱式的類型轉(zhuǎn)換,相當于
int c = 10; double d = (double)c ; // 加不加 (double)都可以
把這種自然而然的、沒有任何風險的轉(zhuǎn)換,稱為隱式轉(zhuǎn)換。如果可以隱式轉(zhuǎn)換,就可以把轉(zhuǎn)換符()省略不寫
注意事項
(1) 小數(shù)轉(zhuǎn)整數(shù)時,小數(shù)部分被截斷。注意不是四舍五入!
double a = 12.9; int b = (int) a; // b 的值是 12,沒有四舍五入
(2) 默認其他類型是不能轉(zhuǎn)換的
例如,boolean 與 int 是不能相互轉(zhuǎn)換的。例如,
boolean k = true; int a = (int) k; // 錯!別亂寫!