Loading...

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),数据类型和值相关联,而和变量名无关,你可以给一个变量赋任意类型的值。这被称为动态类型.