C/C++教程

计算机程序设计c++ 6-3:变量的作用域及存储类型

本文主要是介绍计算机程序设计c++ 6-3:变量的作用域及存储类型,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

变量的作用域

变量的作用域是指变量的使用范围。
根据变量的使用范围不同,C++中的变量被分为局部变量和全局变量。

局部变量

在一个函数内或复合语句内定义的变量称为局部变量(函数的形参也属于局部变量
局部变量只允许在其定义的函数或复合语句中使用,离开所在的函数或复合语句后该局部变量将不能使用

  • 例1
    主函数中定义的变量也不能在其它函数中使用
int main()
{
	int sum = 0;
	sum = f(10);
	cout << sum << endl;
	return 0;
}

int f(int n)
{
	for(int i=1; i<= n; i++)
	{
		sum += i;
	}
	return sum;
}

在这里插入图片描述

注意:
在函数f中,不能使用主函数中的sum变量,它属于主函数的局部变量

  • 例2
    复合语句中定义的变量,也只能在该复合语句中使用
int main()
{
	int i=1, j=3;
	cout << i << " ";
	i++;
	{
		int i = 0;
		i+= j*2;
		cout << i << j << endl;
	}
	cout << i << ', ' <<j << endl;   // 1, 6, 3, 2, 3
}

在这里插入图片描述

注意:
复合语句中定义的变量,也只能在该复合语句中使用

  • 例3
    for 语句中控制变量的作用域
int main()
{
	int a[] = {34, 56, 23, 41, 33}
	int x;
	cin >> x;
	for(int i=0; i<5; i++)
	{
		if(x==a[i])
			break;
	}
	if(i<5) // i use error
		cout << "已经找到,下标为:" << i << endl;
	else
		cout << "未找到!" << endl;
	return 0;
}

在这里插入图片描述

注意:
编译系统通常将循环语句中定义的变量作为局部变量处理
因此该变量在循环外是不能使用的

说明局部变量是在执行该函数或复合语句时自动建立,
当该函数或复合语句执行完毕后将自动释放。所以在不同
的函数或复合语句中定义同名的局部变量,也不会相互干
扰。

全局变量

  • 全局变量说明于所有函数之外,可以为所有函数共同使用
  • 全局变量可以在各个函数之间建立数据的传输通道。局部变量也称为自动类型变量

例子

int a = 3, b = 5;
int max(int a, int b)
{
	return a>b ? a:b;
}

int main()
{
	int a = 8;
	cout << max(a, b) << endl;  // 8
	cout << max(::a, b) << endl;  // 5
	return 0;
}

在这里插入图片描述

注意
在函数中,当局部变量与全局变量同名时,遵循“局
部变量优先”的原则
。这时,如果想使用全局变量,应在变
量名前加上作用域运算::即可

使用用全局变量的几点说明:

  • 全局变量的作用范围是从定义点到整个源程序的结束。在定义点之前,如果其它函数要引用全局变量,可以在该函数中用 extern 对全局变量进行声明
  • 使用全局变量,可以增加函数间的直接联系,减少函数定义时的参数
  • 由于全局变量在整个程序运行中始终占用内存,这样,使用全局变量将降低程序的通用性、可靠性和移植性,这是全局变量的负面作用

变量的存储类型

不同的变量所分配的存储区域也不同,这就是变量的存储类型。

  • C++程序运行时使用的内存区域
    在这里插入图片描述
  • 变量的存储类型
    变量的存储类型是变量在内存中存储的方式,根据变量的存储类型,可以知道变量的作用域和生存期。这里,介绍4个存储类型,分别是
  • auto(自动类)
  • register(寄存器类)
  • static(静态类)
  • extern(外部类)

在c++中定义一个变量的完整形式是:
<存储类型> <数据类型> <变量名>

自动变量-用auto修饰(默认的定义方式)

例如:
定义一个局部变量i。
auto int i;int i; 是相同的

说明:
自动变量在其定义块(函数或复合语句)开始执行时分配空
间,在块执行结束时释放空间
。所以自动变量的生命期开始于块的执行,终止于块的结束

寄存器变量-用register修饰

将尽可能存放在CPU的寄存器中,以提高程序的运行效率

注意
局部变量形参可作为寄存器变量

静态变量-用static修饰

  • 静态变量分配在全局数据区中,定义时系统将提供默认的初始值
  • 静态变量在编译时分配存储空间,在整个程序执行结束后释放存储空间。所以,静态变量具有全局生命期
  • 根据声明的位置不同,静态变量又分为静态局部变量和静态全局变量
  • 静态局部变量是在“块”中定义的静态变量。它具有局部作用域,却有全局生命期。在“块”执行结束后,该静态局部变量并不释放(其值依旧存在),以便下次调用时可继续使用。

外部变量-用extern修饰

如果在一个源文件中定义的全局变量要在其它源文件中使用,则在使用前应该用extern进行声明,表示该全局变量不是在本文件中定义的。

例:
在1.cpp文件中定义全局变量
int Dimension=100;
如果在2.cpp文件中使用,这时,应在2.cpp文件中声明如下:
extern int Dimension;

静态全局变量:
全局变量可以在其它源文件中使用。如果在全局变量前加上static修饰符,则成为静态全局变量。静态全局变量只能在本文件中使用

例如:
函数调用计数器,使用静态局部变量统计某个函数被调用的次数

void fun()
{
	static int n =0;  // 局部静态变量, 第一次调用时候赋值为0,之后都是按照之前的数值计算
	// int n = 0;  // 每次输出都是1
	n++;
	cout << "本函数被调用了" << n << "次" << endl;
}

int main()
{
	int i;
	for(i=1; i< 3; i++)
	{
		fun();
	}
	fun();
	return 0;
}

在这里插入图片描述

这篇关于计算机程序设计c++ 6-3:变量的作用域及存储类型的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!