本节书摘来华章计算机《交互式程序设计 第2版》一书中的第2章 ,第2.7节,Joshua Noble 著 毛顺兵 张婷婷 陈宇 沈鑫 任灿江 译更多章节内容可以访问云栖社区“华章计算机”公众号查看。
2.7 作用域
作用域有时让人很讨厌,由它而起的问题通常难以定位。幸而要避免这样的问题其实还挺简单。
先看一段Processing代码:
void setup() {
if(true)
{
int i = 0;
}
i+=1;
print(i);
}
我们在第3章会仔细讲Processing平台,现在你看不懂也没有关系,直接编译它。编译之后Processing的控制台窗口会弹出些有趣的消息:
Cannot find anything named "i"
找不到名为“i”的东西。怎么回事呢?作用域是程序代码的其中一段或一部分,在这个区域里,你可以访问和获取相应的数据等内容,而在作用域之外则无法访问和获取。图2-8表示了每个变量所属的作用域。
图2-8:一个函数里变量的作用域
一般的规律是,变量在最接近它的花括号内有效。例如在函数内定义了一个变量:
void someFunction() {
int anInt;
}
anInt在函数内有效,右花括号就是它作用域结束的标志。变量如果是在语句内被定义的,比如
if(something) {
int anInt;
}
anInt = 5; // 错误!anInt在花括号之外就失效了
那么它只存在于语句之内,所以上面的这个anInt在if语句之外就失效了。为什么要规定作用域呢?简单说来就是为了让程序分清哪些东西在用,哪些东西没在用,这样运行起来会更加高效。只要记住括号定律就行了:如果变量出现之前有一个左花括号,那么这个变量作用域就是到对应的右花括号为止。
有些变量在整个程序里都有效,不会越出作用域。这类变量被称为“全局变量”。在Processing和Arduino里,全局变量在方法setup()的外面声明。在openFrameworks里情况有点不同,我们在后面专门讲openFrameworks的时候再来详细讨论。后面的章节分别讨论不同的编程语言,每一种语言对全局变量的处理都稍有不同,到时你会对全局变量有更深入的了解。