Variables (程式變數)
變數是用來儲存資料的地方,它有名字、型別、數值;舉個例子,下面這行指令 (又稱為 宣告):
int pin = 13;
創建一個名為 pin
的變數,數值為 13,資料型別為 int
;後面的程式碼你可以透過它的名字來使用這個變數,在使用變數時程式會自動去找出它的值;舉個例子,像這個狀況:
pinMode(pin, OUTPUT);
變數的好處是你只需要指定一次腳位數字就可以一直去使用它,假如你之後決定要把 pin 13 改為 pin 12 的話你只需要改變一點點程式碼即可。你也可以利用語意較清楚的描述來作為變數的名字,使變數所代表的意義更加明確 (例:一支程式控制 RGB LED 的變數叫做 redPin、greenPin、bluePin)。
另外,變數還有比單純使用一個數字方便的優點:那就是你可以用 指派 的方式去改變一個變數的數值 (以等號表示),舉個例子:
pin = 12;
這會把變數的值改變成 12,注意這邊並沒有指明變數的資料型別,也沒有因為指派數值而改變資料型別。變數會永久保持原本的資料型別,只有它的數值會改變 (註:只有在一些語言中有支援,像是 Python,它的資料型別會隨著它的數值變化,而不是隨變數名稱,所以你可以指派任何型別的數值給同一變數,這稱為 動態型別;但在 86Duino 和 Arduino 中不支援動態型別功能)
注意:你必須要先宣告變數才可以去指派數值給它,如果你在使用變數之前沒有先宣告的話,將會得到以下的訊息:” error: pin was not declared in this scope”。
當你指派變數給另一個變數,你只是複製它的數值到另一個變數的記憶體位置,改變其中一個不會對另一個有影響,舉個例子:
int pin = 13; int pin2 = pin; pin = 12;
只有 pin
的數值是 12,而 pin2
仍然是 13。
現在你可能會覺得對錯誤訊息中 ”scope” 的意思產生疑惑,他指的是變數只能在程式的某區段內使用,這取決於你在哪邊宣告它。舉個例子,如果你想要在任意的地方使用一個變數,你可以在程式碼的最上面宣告,這叫做全域變數。請看下面的例子:
int pin = 13; void setup() { pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); }
你可以看到 pin
同時用在 setup()
跟 loop()
函式中,兩個函式都有用到相同的變數,所以改變其中一個的話另一個也會跟著改變,像這樣:
int pin = 13; void setup() { pin = 12; pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); }
此範例中,loop()
中的 digitalWrite()
函式會被傳入 12 而不是 13。12 這個值是在 setup()
函式中指派給變數的。
如果你只是需要在其中一個函式中用到變數,你可以只在該函式中宣告,那麼這個變數就會被限制在該函式裡面使用;舉個例子:
void setup() { int pin = 13; pinMode(pin, OUTPUT); digitalWrite(pin, HIGH); }
在這個例子中,pin 變數只能用在 setup()
函式中;如果你想要做像下面的動作:
void loop() { digitalWrite(pin, LOW); // wrong: pin is not in scope here. }
你將會得到跟上面相同的訊息:“error: ‘pin’ was not declared in this scope”,即使你曾經在程式的某個地方宣告過 pin,你也不能在該函式之外去使用它。
你可能會對此感到疑惑,為什麼不能把所有的變數設為全域變數呢?畢竟我不知道我何時會需要用到這個變數,為什麼我要把它限制在一個函式中呢?答案是,限制變數的使用段落可能會讓你更容易去推估出發生了什麼事。如果一個變數為全域變數的話,它的數值能在程式碼的任何地方被改變,這代表你需要了解整個程式是怎麼操作這個變數的。舉個例子,如果你的變數數值不在預期範圍內,有限制段落的話,你可以更輕鬆的去推估出這個數值從何而來。
See also
本頁由熱血青年 LBU 譯自英文版。
The text of the 86Duino reference is a modification of the Arduino reference, and is licensed under a Creative Commons Attribution-ShareAlike 3.0 License. Code samples in the reference are released into the public domain.