首页 理论教育 Arduino单片机变量冲突和作用范围

Arduino单片机变量冲突和作用范围

时间:2023-10-23 理论教育 版权反馈
【摘要】:没有名称冲突,因为loop()中的x仅在loop()中可见,就像在setup()中定义的x仅在setup()函数中可见一样。图7-3串行显示数据如果仔细观察,可以看到使用if语句块定义的变量temp的内存地址作用域为2292,但使用loop()本地作用域定义的临时变量temp在内存地址为2294。因为它们是不同的变量,不会产生名称冲突的问题,它们存在于不同的作用域范围。如果两个变量在同一作用域范围,使用相同的名称,则会收到错误消息。

Arduino单片机变量冲突和作用范围

如果在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定义,所以编译器必须发出错误消息。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈