Learning Examples | Foundations | Hacking | Links
变量是保存数据的地方。它拥有一个名称,一个值和一个类型。如下语句 (称为一个 声明):
int pin = 13;
建立了一个名为 pin
的变量, 它的值是 13
, 数据类型是 int
. 在后续的程序中,你可以通过使用变量的名称来引用这个变量(检索并使用它的数值)。如下语句:
pinMode(pin, OUTPUT);
pin 的值 (13) 会被传送给 pinMode() 函数。在这里,并不真的需要使用一个变量,以下语句能达到同样的效果:
pinMode(13, OUTPUT);
这个例子中使用变量的优点是你只需要指定引脚的编号一次,就可以在以后多次使用。如果你以后决定把引脚从 13 改成 12,你只要在代码中改动一个地方。同时,你可以使用一个描述性的名称使变量的含意显示清晰(例如,一个控制 RGB LED 的程序就可能有命名为 redPin, greenPin 和 bluePin 的变量)。
变量还有其他优点。最重要的是,你可以通过 赋值 (用等号表示) 来改变一个变量的值。如:
pin = 12;
会使变量的值变成 12。注意这里不需要指定变量的类型: 在赋值时并不会改变它的类型。也就是说,变量名会持久地和一个数据类型关联,只有它的值会改变。[1] 注意在赋值之前必需先声明变量。如果在没有本文中的第一个语句的情况下使用上列语句,你会得到象这样的错误信息:"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); }
如你所见,在 setup() 和 loop() 函数里都用到了 pin
。两个函数引用的是同一个变量,所以改变了其中一个就会影响到另一个,就象下例:
int pin = 13; void setup() { pin = 12; pinMode(pin, OUTPUT); } void loop() { digitalWrite(pin, HIGH); }
在这个例子中,loop() 中调用的 digitalWrite() 函数传入的值是12,因为在 setup() 函数中变量变赋成了这个值。
如果你只需要在单个函数中使用一个变量,可以在函数内声明它,这样它的范围(scope)就被限制在函数内部。便如:
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,但你正尝试在它的有效范围之外使用它。
你也许会觉得奇怪,为什么不让所有的变量都是全局的呢?如果不知道在哪里会用到一个变量,为什么要把变量限制在一个函数里呢?答案是:这样能更容易理解在这个变量上发生了什么。如果一个变量是全局的,它的值在代码的任一个地方都可能被改变,这样你就需要读懂整个程序才能知道这个变量发生了什么变化。比如,当你发现变量的值变成了一个不应该出现的值,这时如果变量有一个限定的有效范围,你就更容易找出这个值是从哪里来的。
[block scope] [size of variables]
[1] 在有些语言里(比如Python),数据类型和值相关联,而和变量名无关,你可以给一个变量赋任意类型的值。这被称为动态类型.