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

Variable Declaration


語法參考主頁面

本頁由熱血青年 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.