1. 程式人生 > >Java變數和運算子

Java變數和運算子

1.變數

變數概述

什麼是變數?變數是一個記憶體中的小盒子(小容器),容器是什麼?生活中也有很多容器,例如水杯是容器,用來裝載水;你家裡的大衣櫃是容器,用來裝載衣褲;飯盒是容器,用來裝載飯菜。那麼變數是裝載什麼的呢?答案是資料!結論:變數是記憶體中裝載資料的小盒子,你只能用它來存資料和取資料。

 計算機儲存單元

變數是記憶體中的小容器,用來儲存資料。那麼計算機記憶體是怎麼儲存資料的呢?無論是記憶體還是硬碟,計算機儲存裝置的最小資訊單元叫“位(bit)”,我們又稱之為“位元位”,通常用小寫的字母b表示。而計算機最小的儲存單元叫“位元組(byte)”,通常用大寫字母B表示,位元組是由連續的8個位組成。

當程式需要使用儲存空間時,作業系統最小會分派給程式1個位元組,而不是1個位。你可能會說,如果程式只需要1個位的空間,系統分派不能只分派1個位嗎?答案是不能!這就像你只需要1支菸,你到商店去買菸,商店分派的最小單元是1盒(20支),他不可能賣給你1支菸。

你可能會想,1個位元組(8位)可以儲存很大的數值了,1位最大是9那麼8位最大值為99999999。你錯了,因為計算機是採用二進行儲存的,而不是我們生活中常用的十進位制。所以1個位元組儲存的最大資料是11111111的二進位制數。

除了位元組外還有一些常用的儲存單位,大家可能比較熟悉,我們一起來看看:

1B(位元組) = 8bit

1KB = 1024B

1MB = 1024KB

1GB = 1024MB

1TB = 1024GB

1PB = 1024TB

基本型別之4類8種

大衣櫃不能用來裝載水,水杯也不能用來裝載衣褲。這說明不同的容器裝載不同的物品。變數也是如此,在建立變數時需要指定變數的資料型別,例如整型變數、浮點型變數等等。結論:變數必須要有明確的型別,什麼型別的變數裝載什麼型別的資料。

水杯是用來裝水的,那麼水杯能裝多少水呢?一噸?我們知道水杯在建立時不只確定了要裝載的是水(資料型別),而且還確定了能裝多少水(資料型別的具體種類)。變數也是如此,需要指定變數能裝載什麼型別的資料,同時也要指定變數能裝載多大的資料。

Java中基本型別一共4類,把這4類展開後共8種基本型別。我們今後編寫程式時使用的是這8種基本型別而不是4類,這8種基本型別指定了範圍。

四類

八種

位元組數

資料表示範圍

整型

byte

1

-128~127

short

2

-32768~32767

int

4

-2147483648~2147483648

long

8

-263~263-1

浮點型

float

4

-3.403E38~3.403E38

double

8

-1.798E308~1.798E308

字元型

char

2

表示一個字元,如('a','A','0','家')

布林型

boolean

1

只有兩個值true與false

常量與型別

前面我們說過100是整數常量,但它是byte、short、int、long中的哪一種呢?下面我們來聊聊這一常量型別的問題。

整數常量可以根據所在範圍來確定型別,例如100在-128~127之間,所以他是byte型別;500在-32768~32767之間,所以它是short型別;100000在-2147483648~2147483648之間,所以它是int型別。java中預設的整數型別是int型別

你可能會認為12345678901在-263~263-1之間,所以它是long型別。注意了,這是錯誤的!!!在Java中整數常量如果不在-2147483648~2147483648之間就必須新增“L”字尾(小寫的也可以,但建議使用大寫),在-2147483648~2147483648之間的也可以新增“L”字尾。也就是說12345678901不在-2147483648~2147483648之間,所以它在Java中是錯誤的常量,你必須這樣寫:12345678901L,這才是正確的常量。所以添加了“L”字尾的整數常量都是long型別的,例如:100L、12345678901L都是long型別的常量。

浮點型別的常量也可使用字尾,在Java中所有沒有後綴以及使用“D”字尾(小寫也可以,但建議使用大寫)的小數都是double型別;float型別常量必須新增“F”字尾(小寫也可以,但建議使用大寫)java中預設的浮點型別是double型別

  •  3.14沒有後綴,所以它是double型別;
  • 5.28D為double型別;
  • 1.26F為float型別。

定義變數(建立變數)

定義變數的語法格式:

資料型別  變數名  =  資料值;
int         a    =  100;

其中int是資料型別,指定了變數只能儲存整數,而且指定了儲存範圍為-2147483648~2147483648。

其中a表示變數名,變數名是識別符號,這說明只要是合法的識別符號都可以用來做變數名。在程式中可以通過變數名來操作變數(記憶體中的小盒子)。

其中“=100”是給變數賦值,即向a變數中寫入100(變數是個小盒子,現在小盒子中儲存的是100)。注意,給變數賦的值一定要與型別符合,也就是說int型別只能儲存整數,而且必須是在-2147483648~2147483648範圍內的整數。100滿足了這兩個條件,所以是正確的。

/*
變數定義格式:
資料型別  變數名  =  變數值;
*/
public class Variable {
    public static void main(String[] args) {
        int a = 10;
        double b = 3.14;
        char c = 'z';
        String s = "i love java";
    
        a = 20;
        System.out.println(a);
    }
}
練習

變數使用的注意事項:

  • 變數定義後可以不賦值,使用時再賦值。不賦值不能使用。
public static void main(String[] args) {
int x;
x = 20; //為x賦值20
System.out.println(x);//讀取x變數中的值,再列印
}
  •  變數使用時有作用域的限制。
public static void main(String[] args) {
int x = 20;
{
    int y = 20;
}
System.out.println(x);//讀取x變數中的值,再列印
System.out.println(y);//讀取y變數中的值失敗,失敗原因,找不到y變數,因為超出了y變數作用範圍,所以不能使用y變數
}
  •  變數不可以重複定義。
public static void main(String[] args){
      int x = 10;
      double x = 5.5;//編譯失敗,變數重複定義
}

  資料型別轉換

不同型別的變數是否可以在一起運算呢?答案是可以的,但要先進行型別轉換再運算。下面我們來學習一下型別轉換。

其實,我們所學習的資料,它的表示方式是可以靈活多變的,比如把小數轉換成整數的操作

轉換的過程中,資料遵循一個原則:

範圍小的資料型別值(如byte),可以直接轉換為範圍大的資料型別值(如int);

範圍大的資料型別值(如int),不可以直接轉換為範圍小的資料型別值(如byte)

那麼,大家還記得每種型別表示資料的範圍嗎?忘記了不要緊,我來告訴大家,將各種資料型別按照資料範圍從小到大依次列出:

byte -> short -> int -> long -> float -> double

關於資料型別轉換有兩種方式,我們來學習一下:

 自動型別轉換

表示範圍小的資料型別轉換成範圍大的資料型別,這種方式稱為自動型別轉換

自動型別轉換格式:

    範圍大的資料型別 變數 = 範圍小的資料型別值;

如:

double d = 1000;或
int i = 100;
double d2 = i;

 強制型別轉換

表示範圍大的資料型別轉換成範圍小的資料型別,這種方式稱為強制型別轉換

強制型別轉換格式:

範圍小的資料型別  變數 = (範圍小的資料型別) 範圍大的資料型別值;

如:

int  i = (int)6.718;   //i的值為6
double  d = 3.14;
int  i2 = (int)d;     //i2的值為3

2.運算子

計算機的最基本用途之一就是執行數學運算,作為一門計算機語言,Java也提供了一套豐富的運算子來操縱變數。我們可以把運算子分成以下幾組:

  • 算術運算子
  • 關係運算符
  • 位運算子
  • 邏輯運算子
  • 賦值運算子
  • 其他運算子
操作符描述例子
+ 加法 - 相加運算子兩側的值 A + B 等於 30
- 減法 - 左運算元減去右運算元 A – B 等於 -10
* 乘法 - 相乘操作符兩側的值 A * B等於200
/ 除法 - 左運算元除以右運算元 B / A等於2
取餘 - 左運算元除以右運算元的餘數 B%A等於0
++ 自增: 運算元的值增加1 B++ 或 ++B 等於 21(區別詳見下文)
-- 自減: 運算元的值減少1 B-- 或 --B 等於 19(區別詳見下文)

我們在使用算術運算子時,記得要注意下列事項:

  • 加法運算子在連線字串時要注意,只有直接與字串相加才會轉成字串。
  • 除法“/”當兩邊為整數時,取整數部分,舍餘數。當其中一邊為浮點型時,按正常規則相除。
  • “%”為整除取餘符號,小數取餘沒有意義。結果符號與被取餘符號相同。
  • 整數做被除數,0不能做除數,否則報錯。

演示(結果可以自己敲一下)

 /*
 * 算術運算子
 */
public class OperatorDemo1 {
    public static void main(String[] args) {
        /*
         * 常量使用算數運算子
         */
        System.out.println(10+20);
        
        /*
         * 變數使用算數運算子
         */
        int x = 10;
        int y = 20;
        //"+"作為加法運算使用
        int z = x + y; 
        //"+"作為連線字串使用
        System.out.println("x="+x);
        System.out.println("y="+y);
        System.out.println("z="+z);
    }
}
View Code

 算數運算子++、--的使用

算數運算子在前面我們已經學習過了,這裡進行一些補充。

在一般情況下,算數運算子不會改變參與計算的變數值。而是在原有變數值不變的情況下,計算出新的值。但是有些操作符會改變參與計算的變數的值,比如++,--。

看下面的程式碼

int a = 3;
int b = 3;
a++;
b--;
System.out.println(a);
System.out.println(b);

上面程式碼的輸出結果a值為4,b值為2;

這說明a的原有值發生了改變,在原有值的基礎上自增1;b的原有值也發生了改變,在原有值的基礎上自減1;

  •  ++運算子,會在原有值的基礎上自增1;
  •  --運算子,會在原有值的基礎上自減1。

在看下面程式碼:

int a = 3;
int b = 3;
++a;
--b;
System.out.println(a);
System.out.println(b);

上面程式碼的輸出結果a值為4,b值為2;

這說明++,--運算子單獨使用,不參與運算操作時,運算子前後位置導致的運算結果是一致的。

接下來,介紹下++,--運算子參與運算操作時,發生了怎樣的變化,我們來看一段程式碼:

int a = 3;
int b;
b = a++ + 10;
System.out.println(a);
System.out.println(b);

上面程式碼的輸出結果a值為4,b值為13;

這裡我要強調一下了,當++,--運算子參與運算操作時,後置++,--的作用:

  •  ++,--運算子後置時,先使用變數a原有值參與運算操作,運算操作完成後,變數a的值自增1或者自減1;

再介紹下++,--運算子前置時,參與運算操作的變化,我們來看一段程式碼:

int a = 3;
int b;
b = ++a + 10;
System.out.println(a);
System.out.println(b);

上面程式碼的輸出結果a值為4,b值為14;

  • ++,--運算子前置時,先將變數a的值自增1或者自減1,然後使用更新後的新值參與運算操作。

 賦值運算子

運算子

運算規則

範例

結果

=

賦值

int a=2

2

+=

加後賦值

int a=2,a+=2

4

-=

減後賦值

int a=2,a-=2

0

*=

乘後賦值

int a=2,a*=2

4

/=

整除後賦值

int a=2,a/=2

1

%=

取模後賦值

int a=2,a%=2

0

注意:諸如+=這樣形式的賦值運算子,會將結果自動強轉成等號左邊的資料型別。

寫一個程式碼,我們看一下賦值運算子的使用

 /*
 * 賦值運算子
 * +=, -=, *=, /=, %= : 
 * 上面的運算子作用:將等號左右兩邊計算,會將結果自動強轉成等號左邊的資料型別,再賦值給等號左邊的
 * 注意:賦值運算子左邊必須是變數
 */
public class OperatorDemo2 {
    public static void main(String[] args) {
        byte x = 10;
        x += 20;// 相當於 x = (byte)(x+20);
        System.out.println(x);
    }
}

結果為30;

比較運算子

比較運算子,又叫關係運算符,它是用來判斷兩個運算元的大小關係及是否相等關係的,結果是布林值true或者false。

運算子

運算規則

範例

結果

==

相等於

4==3

False

!=

不等於

4!=3

True

小於

4<3

False

大於

4>3

True

<=

小於等於

4<=3

False

>=

大於等於

4>=3

True

這裡需要注意一下:

 賦值運算子的 = 符號與比較運算子的 == 符號是有區別的,如下:

  •  賦值運算子的 = 符號,是用來將 = 符號右邊的值,賦值給 = 符號左邊的變數;
  •  比較運算子的 == 符號,是用來判斷 == 符號 左右變數的值是否相等的。

我們通過下面的一段程式碼,我們演示一下這個注意事項:

int a = 3;
int b = 4;
System.out.println( a=b );
System.out.println( a==b );

上面程式碼輸出的結果第一個值為4,第二個值為false。

 邏輯運算子

邏輯運算子,它是用於布林值進行運算的,運算的最終結果為布林值true或false。

運算子

運算規則

範例

結果

&

false&true

False

|

false|true

True

^

異或

true^flase

True

!

!true

Flase

&&

短路與

false&&true

False

||

短路或

false||true

True

  看完圖後,我們來看一下邏輯運算子的常規使用方式:

  • l  邏輯運算子通常連線兩個其他表示式計算後的布林值結果
  • l  當使用短路與或者短路或時,只要能判斷出結果則後邊的部分就不再判斷。

我們通過程式碼演示一下:

boolean b = 100>10;
boolean b2 = false;
System.out.println(b&&b2); // 列印結果為 false
System.out.println(b||b2); //列印結果為 true
System.out.println(!b2); //列印結果為 true
System.out.println(b && 100>10); //列印結果為 true,本行結果的計算方式稍後講解運算子優先順序時解答

好了,我們來總結一下運算子的結果規律吧:

  •  短路與&&:參與運算的兩邊資料,有false,則運算結果為false;
  •   短路或||:參與運算的兩邊資料,有true,則運算結果為true;
  •   邏輯非! : 參與運算的資料,原先是true則變成false,原先是false則變成true。

三元運算子

接下來我們要學習的三元運算子與之前的運算子不同。之前學習的均為一元或者二元運算子。元即參與運算的資料。

 格式:

         (條件表示式)?表示式1:表示式2;

 表示式:通俗的說,即通過使用運算子將運算元聯絡起來的式子,例如:      

       3+2,使用算數運算子將運算元聯絡起來,這種情況,我們稱為算數表示式。

       3>2,使用比較運算子(也稱為條件運算子)將運算元聯絡起來,這種情況,我們稱為條件表示式。

       其他表示式,不再一一舉例。

  三元運算子運算規則:

先判斷條件表示式的值,若為true,運算結果為表示式1;若為false,運算結果為表示式2。

方式一:
    System.out.println( 3>2 ? “正確” : “錯誤” ); 
// 三元運算子運算後的結果為true,運算結果為表示式1的值“正確”,然後將結果“正確”,在控制檯輸出列印

方式二:
    int a = 3;
    int b = 4;
    String result = (a==b) ? “相等” : “不相等”;  
//三元運算子運算後的結果為false,運算結果為表示式2的值“不相等”,然後將結果賦值給了變數result

方式三:
    int n = (3>2 && 4>6) ? 100 : 200;
    //三元運算子運算後的結果為false,運算結果為表示式2的值200,然後將結果200賦值給了變數n

運算子優先順序

在學習運算子的過程中,我們發現,當多個運算子一起使用的時候,容易出現不清晰先後運算順序的問題,那麼,在這裡,我們來學習下,運算子之間的運算優先順序。

下圖是每種運算子的優先順序,按照運算先後順序排序(優先順序相同的情況下,按照從左到右的順序依次運算)

優先順序

描述

運算子

1

括號

()、[]

2

正負號

+、-

3

自增自減,非

++、--、!

4

乘除,取餘

*、/、%

5

加減

+、-

6

移位運算

<<、>>、>>>

7

大小關係

>、>=、<、<=

8

相等關係

==、!=

9

按位與

&

10

按位異或

^

11

按位或

|

12

邏輯與

&&

13

邏輯或

||

14

條件運算

?:

15

賦值運算

=、+=、-=、*=、/=、%=

16

位賦值運算

&=、|=、<<=、>>=、>>>=

優先順序順序看完了,我們來通過程式碼,加強一下:

int n = 3>4 ? 100 : 200;  

這行的程式碼運算執行順序我們來寫一下:

  1.執行 3>4操作,得到布林型別false的結果

  2.通過結果false,將對應的表示式2的結果200,作為運算的最終結果

  3.把200 賦值給變數n

接下來,我們看一個比較複雜的程式碼

int a = 5;
 int b = 3;
 int c = 1;
int n2 = (a>b && b>c) ? (c++) : (++c);

這段程式碼運算執行順序我們也寫一下:

 1.小括號優先順序高,我們先運算第一組小括號中的程式碼

  1.1. 比較運算子”>” 優先順序大於 邏輯運算子”&&”

         先執行 a>b,得到結果true;

        再執行 b>c,得到結果true;

        最後執行 a>b的結果 && b>c的結果,即 true && true, 結果為true

 2.三元運算子中的條件判斷結果為true,返回表示式1的結果 c++

       先將變數c的原有值賦值給變數n2,即n2值為1;

      再將變數c的值自增1,更新為2。

結果為1;

參考:http://www.runoob.com/java/java-operators.html