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