1351 views
# Chapter2 變數(Variable) ###### tags: `processing` `mcl` `program` processing 語法完全參造java ## 宣告 在`processing`中,你可以宣告一些變數值來儲存你需要的資料,常用的變數類型(type)分為兩類,值類型(`value`)與引用類型(`reference`),值類型又稱為基本數據類型,`java`提供8種基本數據類型,大致分為4類: 1. 整數型 | 基本數據類型 | 空間大小 | 取值範圍 | | ------------ | -------- | ------------------------- | | int | 4byte | [-$2^{31}$, $2^{31} - 1$] | | short | 2byte | [-$2^{15}$, $2^{15} - 1$] | | long | 8byte | [-$2^{63}$, $2^{63} - 1$] | 整數(int): 可細分為short整數(佔2個位元組)、int整數(佔4個位元組)與long整數(佔8個位元組)。不同長度的整數,可儲存的整數範圍也不同。long整數佔的記憶體長度比int整數來得多,可表示的整數範圍也就比int整數大。同樣的,int整數可表示的整數範圍也比短整數來得大。 2. 浮點型 | 基本數據類型 | 空間大小 | 取值範圍 | | ------------ | -------- | ----------------------------- | | float | 4byte | [$2^{-149}$, $2^{128} - 1$] | | double | 8byte | [$2^{-1074}$, $2^{1024} - 1$] | 浮點數(float): 主要用來儲存小數數值,可分為float浮點數(佔4個位元組)與double浮點數(佔8個位元組),double浮點數使用的記憶體空間比float浮點數來得多,可表示的精確度也比較大。 3. 字元型 | 基本數據類型 | 空間大小 | 取值範圍 | | ------------ | -------- | ----------------------------- | | char | 2byte | [0, $2^{16} - 1$] | 字元(Char): char型態用來儲存'A'、'B'、'林'等字元符號。在JDK8中,Java的字元採Unicode 6.2編碼,JVM實作採UTF-16 Big Endian,所以每個字元型態佔兩個位元組,中文字元與英文字元在Java中同樣都是用兩個位元組儲存。 4. 布林型 | 基本數據類型 | 空間大小 | 取值範圍 | | ------------ | -------- | ----------------------------- | | boolean | 1byte | [false,true] | 布林值(boolean): boolean型態可表示true與false,分別代表邏輯的「真」與「假」。在Java中不用在意boolean型態的長度,因為你也無法將boolean型態與其它型態作運算。 除基本類型以外都是引用類型。 ### 宣告的語法如下: ![](https://codimd.mcl.math.ncu.edu.tw/uploads/upload_079a64a29dc20a8f5d3b3a36a6586bb8.png) 第一格放資料的型態,也就是上述所說 第二個放變數的名字 最後賦予變數一個值(有些型態若沒有設會自動設為0) ## 變數的生命週期 變數分為兩類,全域變數與區域變數,全域變數在當前的程式都可以被任一個區域使用,區域變數只能在當前的函數使用,要注意再命名的時候,區域變數盡量不要跟全域變數取相同的名字,避免混淆,若產生相同的名稱下,`processing`會優先使用區域變數。 ## 變數命名規則 對於每個變量我們需要給它取一個名字,就如同我們每個人都有屬於自己的響亮的名字一樣。 * 硬性規則: 1. 變數名由字母(廣義的Unicode字符,不包括特殊字符)、數字和下劃線構成,數字不能開頭。 2. 大小寫敏感(大寫的a和小寫的A是兩個不同的變數)。 3. 不要跟關鍵字(有特殊含義的單詞,後面會講到)和系統保留字(如函數、模塊等的名字)衝突。 * 非硬性規則: 1. 類別以英文大寫字母開頭,若有多個英文單字組成,採取大寫駝峰型 (upper camel case) 2. 方法或變數(包括參數、屬性等)以英文小寫字母開頭,若有多個英文單字組成,採取小寫駝峰型 (lower camel case) ``` UpperCamelCase //合法字 lowerCamelCase //合法字 3line //不合法 String //不推薦,容易混淆 ``` ### 範例1 ``` java=1 //在程式最前面宣告的為全域變數 int globalVariable = 0; void setup(){ //在函數宣告的為區域變數,只有此函數可以使用 int localVariable = 1; print(globalVariable); // 0 print(localVariable); // 1 } void draw(){ print(globalVariable); // 0 print(localVariable); // error:localVariable cannot be resolved to a variable } ``` ### 範例2 ``` java=1 float ballpositionX=50; float ballpositionY=100; void setup(){ size(200,200); background(0); fill(255); //將下方的圖形塗滿顏色,語法為 fill(顏色) circle(ballpositionX,ballpositionY,20); //circle函數可以在指定的座標畫一個圓 //語法為circle (x座標,y座標,直徑) } //在(20,100畫一個半徑10的圓,並塗滿白色) ``` ![](https://codimd.mcl.math.ncu.edu.tw/uploads/upload_747b27223d6a2d6542b79fccb1dd66f7.png) ## 裝箱與拆箱 ## 運算子(Operator) 程式語言中提供運算功能的就是運算子。 | 運算子 | 描述 | | ---------- | ---------- | | `[]` `[:]` | 下標,切片 | | `**` | 指數 | | `~` `+` `-`| 取反, 正負號 | | `*` `/` `%` `//` | 乘,除,模(mod),整除| | `+` `-` | 加,减| | `>>` `<<` | 右移,左移 | | `&` | 位與 | | `^` `||` |異或,位或| | `<=` `<` `>` `>=`| 小於等於,小於,大於,大於等於 | | `==` `!=` | 等於,不等於| | `is` `is not`| 身份運算子 | | `in` `not in` | 成員運算子 | | `not` `||` `&&` | 邏輯運算子 | | `=` `+=` `-=` `*=` `/=` `%=` `//=` `**=` `&=` `|=` `^=` `>>=` `<<=` |賦值運算子| 比較運算子有的地方也稱為關係運算子,包括`==`、`!=`、`<`、`>`、`<=`、`>=`,我相信沒有什麼好解釋的,大家一看就能懂,唯一需要提醒的是比較相等用的是`==`,請注意這個地方是兩個等號,因為`=`是賦值運算子,我們在上面剛剛講到過,`==`才是比較相等的比較運算符。比較運算符會產生布林值,要麼是`true`要麼是`false`。 ### 範例1 ``` processing=1 void setup(){ int a=100; int b=200; print(a+b); // 300 print(a-b); // -100 print(a%7) //2 print(a==b) //false print(a<b) //true print(true && false) //false //好好學基數 } ``` ### 範例2 ```processing=1 float positionX=0; float positionY=100; void setup(){ size(200,200); } void draw(){ background(0); circle(positionX,positionY,20); positionX+=5; // += 代表說將前面的值加上後面的數字,等同於positionX=positionX+5 //若positionX現在等於5,做完運算後會等於5+5=10 } ``` 效果如下: <img src="https://media.giphy.com/media/SUvHcYgQBpt0dcicOf/giphy.gif"></img> 可以注意的是`draw`是一個會不斷重複執行的函數,所以她會不斷重複執行裡變得程式碼,可以把它想成時間的推移,所以positionX的數值會不斷地更新並且+5,進而更新圓的位置。 注: 可以想想若把background(0)放在`setup`裡面會發生甚麼事情。