如果在loop()中定义了一个名为x的变量,但在setup()中又定义了一个名为x的变量,会发生什么情况呢?这两个变量不会因为名称相同而“冲突”吗?没有名称冲突,因为loop()中的x仅在loop()中可见,就像在setup()中定义的x仅在setup()函数中可见一样。事实上,如果你的程序中有以下代码片段:
temp的第二个定义不会生成重复的定义错误,因为if语句块中定义的temp在temp的第二个定义发生之前就已失效。
为了让学习者明白本地作用域不同于语句块作用域,对清单7-1进行如下修改。
如下语句:
Serial.println((long)&temp);
使用“address of”运算符(&),这会使程序显示变量的左值,而不是右值(我们将在第8章中了解变量指针的地址)。如果你运行该程序,串行监视器将显示如图7-3所示的数据。
(www.xing528.com)
图7-3 串行显示数据
如果仔细观察,可以看到使用if语句块定义的变量temp的内存地址作用域为2292,但使用loop()本地作用域定义的临时变量temp在内存地址为2294。显然,具有不同左值的变量,不是同一个变量,即便是它们使用相同的名称。因为它们是不同的变量,不会产生名称冲突的问题,它们存在于不同的作用域范围。
如果两个变量在同一作用域范围,使用相同的名称,则会收到错误消息。例如,如果将代码修改为:
编译器发出以下错误消息:
LocalScopeProgram.cpp:In function'void loop()':
LocalScopeProgram:30:error:redeclaration of'int temp'
LocalScopeProgram:21:error:'int temp'previously declared here
因为现在在同一作用域级别(即同一函数中的本地作用域)有两个temp定义,所以编译器必须发出错误消息。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。