Java學習篇【四、操作符與流程控制】

1、操作符

我們知道了程序用變量來表示數據,而操作符,顧名思義,就是來操作數據。在由操作符和數據所構成的表達式,被操縱的數據也被稱爲數據元。

優先級 操作符分類 操作符
由高到低 一元操作符 ! ++ – - ~
算術操作符、位操作符 * / % + - >> << >>>
比較操作符 > < >= <= != ==
邏輯操作符 && || % | ^
三元操作符 布爾表達式 ? 表達式1: 表達式2
賦值操作符 = *= += -= /= %=

1.1 算術操作符

Java的算數操作符與其它大多數程序設計語言都是相同的,其中包括加(+)、減(-)、乘(×)、除(÷)以及取模(%)。

假設:整數變量A的值爲10,變量B的值爲20,如下表:

操作符 描述 例子
+ 加法 - 相加運算符兩側的值 A + B 等於 30
- 減法 - 左操作數減去右操作數 A – B 等於 -10
* 乘法 - 相乘操作符兩側的值 A * B等於200
/ 除法 - 左操作數除以右操作數 B / A等於2
% 取餘 - 左操作數除以右操作數的餘數 B%A等於0
++ 自增: 操作數的值增加1 B++ 或 ++B 等於 21
自減: 操作數的值減少1 B-- 或 --B 等於 19

注:

  1. 前綴自增自減法(++a,–a): 先進行自增或者自減運算,再進行表達式運算;
  2. 後綴自增自減法(a++,a–): 先進行表達式運算,再進行自增或者自減運算;

1.2 比較運算符

假設:整數變量A的值爲10,變量B的值爲20

操作符 描述 例子
== 檢查如果兩個操作數的值是否相等,如果相等則條件爲真。 (A == B)爲假。
!= 檢查如果兩個操作數的值是否相等,如果值不相等則條件爲真。 (A != B) 爲真。
> 檢查左操作數的值是否大於右操作數的值,如果是那麼條件爲真。 (A> B)爲假。
< 檢查左操作數的值是否小於右操作數的值,如果是那麼條件爲真。 (A <B)爲真。
>= 檢查左操作數的值是否大於或等於右操作數的值,如果是那麼條件爲真。 (A> = B)爲假。
<= 檢查左操作數的值是否小於或等於右操作數的值,如果是那麼條件爲真。 (A <= B)爲真。

1.3 位運算符

假設:整數變量A的值爲60,變量B的值爲13

操作符 描述 例子
如果相對應位都是1,則結果爲1,否則爲0 (A&B),得到12,即0000 1100
| 如果相對應位都是0,則結果爲0,否則爲1 (A | B)得到61,即 0011 1101
^ 如果相對應位值相同,則結果爲0,否則爲1 (A ^ B)得到49,即 0011 0001
~ 按位取反運算符翻轉操作數的每一位,即0變成1,1變成0。 (~A)得到-61,即1100 0011
<< 按位左移運算符。左操作數按位左移右操作數指定的位數。 A << 2得到240,即 1111 0000
>> 按位右移運算符。左操作數按位右移右操作數指定的位數。 A >> 2得到15即 1111
>>> 按位右移補零操作符。左操作數的值按右操作數指定的位數右移,移動得到的空位以零填充。 A>>>2得到15即0000 1111

1.4 邏輯運算符

假設:布爾變量A爲真,變量B爲假

操作符 描述 例子
&& 稱爲邏輯與運算符。當且僅當兩個操作數都爲真,條件才爲真。 (A && B)爲假。
| | 稱爲邏輯或操作符。如果任何兩個操作數任何一個爲真,條件爲真。 (A | | B)爲真。
稱爲邏輯非運算符。用來反轉操作數的邏輯狀態。如果條件爲true,則邏輯非運算符將得到false。 !(A && B)爲真。

補充:
邏輯運算符包含短路邏輯運算,即左邊條件如果成立,則表示該語句條件“成立”,不繼續執行後續判斷。

1.5 三元運算符

三元運算符,又稱條件運算符。

格式如下:

# ?前爲表達式,如果表達式返回結果爲true,則x賦值爲:前的值,false則x賦值爲:後的值
variable x = (expression) ? value if true : value if false

# eg

int age = 23;

String name = (age == 23) ? "bboyhan": "BBOYHAN";

System.out.println(name);

1.6 運算轉換

Java規定,在執行數據的操作運算,必須是同一數據類型。如整型只能和整型進行+操作,我們知道了Java的8大基本數據類型定義了不同數值範圍的數據。Java定義了若干使用於表達式的類型提升規則。

  1. byte、short、char類型的數據在進行運算時將自動轉化爲int類型;
  2. 如果其中一個操作數是float類型,另一個將轉換爲float類型;
  3. 如果其中一個操作數是long類型,另一個將轉換爲long類型;
  4. boolean類型與其他基本類型不能進行類型的轉換(既不能進行自動類型的提升,也不能強制類型轉換),否則,將編譯出錯。

在運算過程中,由低字節向高字節自動轉換(正向過程),Java會自行處理。

類型轉換

但由高字節需要向低字節轉換(逆向過程),需要使用強制轉換(可能丟失精度)。需要注意的一點是:在強制類型轉換中目標類型和源類型變量的類型始終沒有發生改變。

int a=(int)3.14;

提問:float類型能否與long類型進行自動轉換?

答:能,float能表示的數的範圍比long大,一個long型數可以轉爲float型。

  1. long類型,取值範圍是-2^63 --> 2^63-1(-9 223 372 036 854 775 808 ~ 9 223 372 036 854 775 807)
  2. float類型,取值範圍是2^(-149) --> (2-2(-23))*2127,也就是Float.MIN_VALUE和Float.MAX_VALUE

任何一個long類型的數字都可以使用float類型的表示方法來表示。但是,由於float有精度限制,所以在轉換的過程中有可能丟失精度

float內存存儲原理

在IEEE標準754中,float浮點數分爲三部分組成:

  1. 符號位(S),0表示正數,1表示負數。翻轉該位的值會翻轉該數字的符號。
  2. 指數位(E),指數字段需要表示正指數和負指數。
  3. 尾部(F),也被稱爲有效數,代表數字的精度的位。
Sign Exponent Fraction
單精度,Single Precision 1 [31] 8 [30–23] [22–00]
雙精度,Double Precision 1 [63] 11 [62–52] 52 [51–00]

Laid out as bits, floating point numbers look like this:

Single: SEEEEEEE EFFFFFFF FFFFFFFF FFFFFFFF

Double: SEEEEEEE EEEEFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF FFFFFFFF

2、流程控制

現實生活中,不論是日常事務還是生產工序,都會按照特定的流程進行運轉。在Java當中,同樣地可以通過特定的語句進行相應的流程控制。

2.1 分支語句

(一)if else

if…else…語句,布爾表達式的值爲true時,執行if代碼塊,爲false時,執行else代碼塊。

if(布爾表達式){
    //...
}else{
    //...
}
int x = 1;
if(x == 1){
    System.out.println("x 等於 1,執行這句")
}else{
    System.out.println("x 不等於 1,執行這句")
}

多個條件的情況,可以在中間插入 else if(布爾表達式)。

int x = 1;
if(x < 1){
    System.out.println("x 小於 1,執行這句")
}else if (x == 1){
    System.out.println("x 等於 1,執行這句")
}else{
    System.out.println("否則,執行這句")
}

(二)switch

switch case 語句判斷一個變量與一系列值中某個值是否相等,每個值稱爲一個分支。

switch(expression){
    case value :
       //代碼
       break; //可選,不寫相當於會繼續執行下方的case判斷
    case value :
       //代碼
       break; //可選
    //你可以有任意數量的case語句
    default : //可選
       //...
}
int age = 23;

switch(age){
    case 18 :
       System.out.println("age 等於 18,執行,有break,結束")
       break;
    case 23 :
       System.out.println("age 等於 23,執行")
       //break; //沒break,繼續往下執行 
    default : 
       System.out.println("其它情況,執行")
}

switch 語句中的變量類型可以是: byte、short、int、char、String、Enum類型,同時 case 標籤必須爲字符串常量或字面量。

2.2 循環語句

(一)while、do…while

while( 布爾表達式 ) {
    //...
}

# eg

int x = 10;
while( x < 20 ) {
    System.out.print("value of x : " + x );
    x++;
    System.out.print("\n");
}
do {
    //...
}while( 布爾表達式 );

# eg

int x = 10;
 
do{
    System.out.print("value of x : " + x );
    x++;
    System.out.print("\n");
}while( x < 20 );

(二)for

形式一:

for(初始化; 布爾表達式; 更新) {
    //...
}

# eg

int[] intList = {1, 2, 3, 4};

//遍歷
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    System.out.println(i);
}

形式二:

# for (循環變量類型 循環變量名稱 : 要被遍歷的對象)  循環體

/* 建立一個數組 */
int[] intList = {1, 2, 3, 4};

/* 開始遍歷 */
for (int i : intList) {
    System.out.println(i);
}
 

2.3 流程跳轉

語句 說明
break 終止循環
continue 跳過本次(當前)循環
return 退出本方法,跳至上層調用方法
# eg

int[] intList = {1, 2, 3, 4};

//遍歷
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 1){
        continue; //跳出本次循環,不打印1
    }
    System.out.println(i);
}
# eg

int[] intList = {1, 2, 3, 4};

//遍歷
for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 2){
        break; //終止循環,不再執行
    }
    System.out.println(i);
}

# 擴展

int[] intList = {1, 2, 3, 4};

//遍歷
A:for (int j = 0; j < intList.length; j++) {
    int i = intList[j];
    if(i == 2){
        break A; //跳至A,A可任意命名
    }
    System.out.println(i);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章