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.