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.