怎么可能有两个同名的变量——一个是全局变量,另一个是局部变量

How is it possible to have two variables with same names - one is global and another one is local?

本文关键字:一个 局部变量 全局变量 另一个 可能有 两个 变量      更新时间:2023-10-16

我知道两个变量可以在两个不同的函数中声明为相同的名称。我们如何在已经在全局范围中声明的函数中声明变量?

这被称为变量阴影。在C++中,可以使用范围解析运算符::来引用块内部的全局变量。C语言没有这一点,但是您也可以使用以下技术来访问全局变量:

#include <stdio.h>
int a = 100;
int main(void)
{      
int a = 200;
printf("%dn", a); // prints 200
// anonymous block used to refer to global a
{
extern int a;
printf("%dn", a); // prints 100
}
return 0;
}

即使这样也有可能,要小心,它可能会混淆其他程序员,即它违反了"不要聪明"的原则。

对于C++,您可以始终使用解析运算符来指定您正在谈论的范围(::)

然而,在C中,规则是在更具体的范围的上下文中使用变量。

int num = 5;
int main()
{
printf("%dn", num);
int num = 3;
printf("%dn", num);
return 0;
}

打印

5
3
变量的作用域是代码中变量可见的部分。因此,全局变量随处可见,而局部变量仅对特定代码段可见。
#include <iostream>
using namespace std;
int a=9;
int main()
{
int a =8;
cout<<a<<endl;
cout<<::a;
return 0;
}

在上面的c++代码中,第一个输出是8,而第二个输出是9。在这里,这两个变量在代码中都是可见的,但使用范围解析操作符,您可以决定实际需要哪个变量。

简单地说,如果一个程序中的多个变量具有相同的名称,那么编译器就要遵循固定的准则来选择要执行的变量。我将在下面的一个例子中对它们进行详细说明。

顾名思义,全局变量是在任何函数之外声明的,并且可以在代码的任何部分中访问。然而,在另一个变量与全局变量同名的情况下,局部变量将获得更高的";偏好";对于之后出现的代码部分,它是声明的。

例如,

int num = 25;

class Print
{
int num;
Print();
};
Print::Print()
{
num = 98;
}
void PrintNumber(void)
{
int num = 12;
}

int main(void)
{
cout << num << endl;

int num = 34;
cout << num << endl;

PrintNumber();

Print object;
cout << object.num << endl;
}

我已经试着涵盖了每一个可能的场景,如果我错过了任何场景,请毫不犹豫地通知我。无论如何,这个程序的结果将是:

25

34

12

98

第一个是全局的;由于类Print的变量num和函数PrintNumber()分别本地化为该类和该函数的对象,因此此处只能访问全局变量。第二个数字也是如此,只是具有相同数字num的局部变量具有更高的特权,因此它被赋予了比全局变量更高的可访问性(注意我的错误英语,很抱歉)。然后,当调用PrintNumber()函数时,它会打印该局部变量的num。最后,Print类的对象将输出存储在该类的num中的值。

希望这能回答你的问题。