5.函数的变量的作用域

5.函数-变量的作用域


5.1 知识点

知识回顾

在我们之前学习条件分支语句的练习题中,感受过变量作用域。

请说明以下代码的打印结果(不要打一遍代码,请直接通过阅读说出结果):

int a = 5;
if (a > 3)
{
    int b = 0;
    ++b;
    b += a;
}
cout << b << endl;

上面打印 b 的代码会报错。因为在语句块中声明的变量的作用域只在该语句块内有效,不能在外部使用。

什么是变量作用域

变量作用域指的是程序中变量的作用范围。

  • 局部变量的作用域局限于局部。
  • 全局变量的作用域是整个程序。

我们目前学习的变量大多是局部变量,它们通常在函数内部或各个语句块中(如条件分支、循环等)声明。

总结来说,所有在语句块中(如函数语句块、if语句块、while语句块、for语句块等)定义的变量都是局部变量,作用范围仅限于语句块内部。

int a = 5;
if (a > 3)
{
    int b = 0;
    ++b;
    b += a;
}

全局变量

全局变量是指在函数体外声明的变量,它不属于某个函数,也不属于任何语句块,而是属于整个C++源文件,可以在程序的任何位置访问,包括其他文件中。

int myAge = 18;

void changeAge()
{
    myAge = 999;
}

cout << myAge << endl; // 输出 18
changeAge();
cout << myAge << endl; // 输出 999

内外部同名变量

当内部作用域和外部作用域声明了同名变量时,内部作用域中的变量会屏蔽外部作用域中的变量。

cout << myAge << endl; // 输出 999
int myAge = 888;
cout << myAge << endl; // 输出 888
changeAge();
cout << myAge << endl; // 输出 888

int b = 5;
if (b > 3)
{
    int b = 666;
    cout << b << endl; // 输出 666
}
cout << b << endl; // 输出 5

变量的生命周期

  • 局部变量:当语句块被调用时创建并分配内存;当语句块执行完毕时,被销毁并释放内存。
  • 全局变量:程序开始时创建并分配内存;程序结束时销毁并释放内存。

总结

  • 局部变量:在语句块(大括号 {} 内部)中声明的变量,生命周期从声明开始,到语句块执行结束为止。
  • 全局变量:不在语句块中的变量,生命周期从程序开始,一直持续到程序结束为止。

变量的作用域:

  • 局部:我们需要分析当前局部变量声明在哪个语句块中。上级语句块中的变量可以在下级语句块中使用,反之则不能。
  • 全局:可以在程序的任何位置使用。如果当前语句块中声明的变量与全局变量同名,则会以当前声明的局部变量为准。

5.2 知识点代码

Lesson05_函数_变量的作用域.cpp

#include <iostream>
using namespace std;

//全局变量 就是不被包裹在任何语句块之中
int myAge = 18;

void changeAge();

int main()
{
    std::cout << "变量的作用域\n";

    #pragma region 知识回顾

    //我们之前在学习条件分支语句的练习题中感受过变量作用域
    /*请说明以下代码的打印结果(不要打一遍代码,请直接通过阅读说出结果)
    int a = 5;
    if (a > 3)
    {
        int b = 0;
        ++b;
        b += a;
    }
    cout << b << endl;*/
    //上面打印b的代码会报错
    //在语句块中声明的变量的作用域只在该语句块中生效
    //不能在外部使用

    #pragma endregion

    #pragma region 知识点一 什么是变量作用域

    //变量作用域就是程序中变量的作用范围
    //局部变量的作用域就是局部的
    //全局变量的作用域就是整个程序的

    //我们目前学习的变量使用都是局部变量
    //这些变量都是在函数内部声明或者各语句块中声明的(条件分支、循环等)

    //总的来说
    //在各语句块中(函数语句块、if语句块、while语句块、for语句块等等)定义的变量都是局部变量
    //作用范围仅限于语句块内部

    int a = 5;
    if (a > 3)
    {
        int b = 0;
        ++b;
        b += a;
    }

    #pragma endregion

    #pragma region 知识点二 全局变量

    //全局变量是在函数体外声明的变量
    //它不属于某个函数,也不属于任何语句块
    //而是属于整个C++源文件,可以在程序的任何位置访问它(包括其他文件中)

    cout << myAge << endl;//18
    changeAge();
    cout << myAge << endl;//999

    #pragma endregion

    #pragma region 知识点三 内外部同名变量

    //当内部作用域和外部作用域声明了同名变量时
    //内部作用域中的变量会屏蔽外部作用域中的变量

    cout << myAge << endl;//999
    int myAge = 888;
    cout << myAge << endl;//888
    changeAge();
    cout << myAge << endl;//888

    int b = 5;
    if (b > 3)
    {
        int b = 666;
        cout << b << endl;//666
    }
    cout << b << endl;//5

    #pragma endregion

    #pragma region 知识点四 变量的生命周期

    //局部变量
    //语句块被调用时创建分配内存
    //语句块执行完毕时被销毁和释放内存

    //全局变量
    //程序开始时创建分配内存
    //程序结束时销毁和释放内存

    #pragma endregion

    #pragma region 总结

    //局部变量:语句块(大括号{}内部)中声明的变量
    //         生命周期从声明开始,到语句块执行结束为止
    //全局变量:不再语句块当中(不在最上级的语句块中)声明的变量
    //         生命周期从程序开始,一直持续到程序结束为止
    //变量的作用域:
    //局部:我们要分析当前局部变量时声明在哪个语句块中的 
    //     上级语句块中的变量可以在下级中使用;反之,不能使用
    //全局:可以在程序的任何位置使用
    //     如果当前语句块中生命的变量和上级(局部、全局)变量同名,会以当前声明的变量为准

    #pragma endregion
}


void changeAge()
{
    myAge = 999;
}

5.3 练习题

什么是值传递?

值传递是函数参数传递的一种方式。
在值传递中,调用函数时将实参的值复制一份传递给形参,函数内部对形参的修改不会影响实参的值。
值传递通常用于不希望函数内部修改传入数据的情况。

局部变量和全局变量的区别是什么?

定义位置不同

局部定义在代码块内部;全局定义直接定义在代码文件中(最上级语句块外部)。

作用域不同

局部仅仅作用于代码块内部;全局作用在整个程序。

生命周期不同

随着代码块执行结束而销毁;程序开始到程序结束。



转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏