C++ 教程 在线

1839C++ 变量作用域

静态变量

存储在静态数据区的变量会在程序刚开始运行时就完成初始化,也是唯一的一次初始化。共有两种变量存储在静态存储区:全局变量和 static 变量,只不过和全局变量比起来,static 可以控制变量的可见范围,说到底 static 还是用来隐藏的。虽然这种用法不常见。

PS:如果作为 static 局部变量在函数内定义,它的生存期为整个源程序,但是其作用域仍与自动变量相同,只能在定义该变量的函数内使用该变量。退出该函数后, 尽管该变量还继续存在,但不能使用它。

#include <iostream>
using namespace std;

int count = 1; //全局变量

int fun()
{
    static int count = 10; // 在第一次进入这个函数的时候,变量 count 被初始化为 10!并接着自减 1,以后每次进入该函数,count 的值是上一次函数运行之后的值
    return count--;        // 就不会被再次初始化了,仅进行自减 1 的操作;在 static 发明前,要达到同样的功能,则只能使用全局变量
}
 
//int count = 1; //全局变量
 
int main()
{
     cout<<"global  "<<"local staic"<<endl;
     for(; count <= 10; ++count)
        cout<<count<<"        "<<fun()<<endl;
     return 0;
}

并且,由此可见全局变量和局部静态变量 count 的作用域是不同的。

1838C++ 变量作用域

全局变量从定义处开始至程序结束起作用,即全局变量存在有效作用域。

#include<iostream>
using namespace std;

int main()
{
     cout<<"a= "<<a<<endl; //编译不通过,a是未知字符
     return 0;
}
int a=10; //全局变量从此处定义

若要想让 main 函数也使用全局变量 a,可以用 extern 对全局变量进行声明,就可以合法使用了。

#include<iostream>
using namespace std;

int main()
{
     extern int a;
     cout<<"a= "<<a<<endl; //合法,输出10
     return 0;
}
int a=10; //全局变量从此处定义

1837C++ 变量作用域

全局变量的值可以在局部函数内重新赋值。

#include <iostream>

using namespace std;

// 全局变量声明
int g = 20;
int fun1(int a,int b){
    g=a+b;
    cout<<"被改变的全局变量为:"<<g<<endl;
    return 0;
}

int fun2(){
    cout<<"此时的全局变量为:"<<g<<endl;
    return 0;
}

int main(){
    fun2();
    fun1(10,20);
    fun2();
    return 0;
}

1836C++ 变量作用域

在一个函数体内可以存在重名的变量,前提是它们的作用域不同。

#include <iostream>
using namespace std;

int main()
{
    int b = 2;
    {
        int b = 1;
        cout << "b = " << b << endl;
    }
    cout << "b = " << b << endl;
}

输出为:

b = 1
b = 2

当变量间出现重名的情况下,作用域小的屏蔽作用域大的,所以上面第一个 cout 输出 b 的值为 1,但由于在块里面申请的变量作用域只限于当前块,所以离开这个块后变量会自动释放,所以第二个 cout 输出 b 的值为 2。

1835C++ 变量作用域

在程序中,局部变量和全局变量的名称可以相同。

但是在函数内的局部变量与全局变量是两个独立的变量,互不影响。

下述代码中,全局变量定义了一个int g=99,局部变量定义了一个int g=10,由于这两个g所在的作用域不同,所以各自独立。

#include <iostream>
using namespace std;

// 全局变量声明
int g = 99;

// 函数声明
int func();

int main()
{
    // 局部变量声明
    int g = 10;
    //cout << g;
    int kk = func();
    cout << kk;
    return 0;
}

// 函数定义
int func()
{
    return g;
}