关于局部变量隐藏全局变量的必须注意的小错误

一、正常使用

(一)全部使用全局变量:

输出10和10。

(二)使用全局和局部变量

输出:5

二、局部变量隐藏全局变量

代码如下:

此时会报错:局部变量“firstNum”在声明之前无法使用。局部变量的声明隐藏字段

即,在局部定义一个与全局变量同名的变量后,那么此变量无论出现在代码什么位置,都是代表局部变量。因此这个错误与下面这个错误是相同的:

### C语言中全局变量局部变量同名时的行为及作用域规则 在C语言中,当全局变量局部变量名称相同时,遵循一定的作用域规则来决定哪个变量会被优先访问。 #### 1. 局部变量的优先级高于全局变量 如果在一个函数或代码块内部定义了一个与全局变量同名的局部变量,则在这个代码块范围内,局部变量会屏蔽全局变量。这意味着,在这个范围内的任何对该变量的引用都会指向局部变量而不是全局变量[^1]。 #### 2. 使用 `extern` 关键字访问被屏蔽的全局变量 尽管局部变量会在其作用域内覆盖同名的全局变量,但可以通过使用 `extern` 声明重新引入全局变量并对其进行访问。这允许程序员即使存在局部变量的情况下也能操作全局变量[^3]。 ```c #include <stdio.h> int global_var = 10; // 定义一个全局变量 void example() { int global_var = 20; // 定义一个局部变量,与全局变量同名 printf("Local variable: %d\n", global_var); // 输出局部变量 extern int global_var; printf("Global variable: %d\n", global_var); // 访问全局变量 } int main() { example(); return 0; } ``` 上述代码展示了如何通过 `extern` 来区分同名的局部变量全局变量。 #### 3. 作用域的具体范围 - **全局变量** 的作用域是从它被定义的位置到文件结束处。通常为了方便管理,全局变量被放置在源文件的顶部位置[^2]。 - **局部变量** 的作用域仅限于它们所在的代码块(如函数体、循环体内或其他复合语句)。一旦程序执行离开该代码块,局部变量就不再可见。 #### 4. 编译器行为 编译器在解析变量时总是先查找当前最窄的作用域是否有匹配的名字。如果有找到,则不会继续向外层作用域寻找其他可能具有相同名字的变量。这种机制确保了局部变量能够有效地隐藏更广范围内的同名实体。 --- ### 总结 综上所述,当发生命名冲突时,C语言规定局部变量在其有效区域内拥有更高的优先权,并遮蔽掉同名的全局变量。然而,开发者仍然可以借助特定手段比如 `extern` 显式指定希望使用的具体变量实例。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值