C/C++ :局部变量和全局变量(知识点与经典例题)

//文章导读
本文分为两大部分
一:相关知识点
二:相关例题

相关知识点

1.局部变量

局部变量是指作用域在函数级和块级的变量
它包括自动类变量(auto)寄存器类变量(register)内部静态变量(static) 以及 函数参数

  • 自动类变量  定义时可加auto说明符,也可以省略,比如说:int a // 没有说明则按自动类变量储存。需要注意的是 自动类变量是没有默认值的,其值是无意义的(通称“垃圾值”)(笔者表示“垃圾”形容的十分贴切),如下:
#include <stdio.h>
int main()
{
  static int n;
  auto int m;  // auto int m=0;  我们应该及时赋值,避免粗心而产生“垃圾“
  register int a;//和auto 一样 ,不初始化就输出,便是垃圾。
  
  printf("%d",n); // 静态变量是有默认值的,int类型变量的默认值为0,故输出为0。
  printf("%d",m); // 输出的是:-8589934600 (这是什么垃圾)
  return 0;
}
  • 寄存器类变量 定义时要在类型前加 register 说明符。当寄存器(这里指CPU的通用寄存器)处于空闲状态时,存放在寄存器里的变量其存取速度会提高(故惯将使用频率高的数据定义为寄存器类,以提高程序运行效率。)。当寄存器处于非空闲状态时,寄存器类变量按自动类变量处理。需要注意的是 :和自动类变量相同,寄存器类变量也是没有默认值的。

  • 内部静态变量  它的说明符为 static ,之所以叫它“内部“,是因为与全局变量中的外部静态类变量相比,前者定义在函数内,后者定义在函数外,so…。与上述两个类型相比,它是有默认值的(int 为0;char 为‘0’;float 为0.0)。值得注意与了解的是:它的作用域与上述两种类型相同,但他的生存期较长,是一种可见性与存在性不同步的变量。

  • 函数参数  这个貌似没啥值得注意的,函数参数在函数调用时分配内存,在函数结束时内存就释放掉了。

全局变量

全局变量是指作用域在程序级和文件级的变量。它包括外部变量和外部静态变量。

  • 外部变量 它对应的说明符是 extern ,该变量类型的作用域是程序级的 。也就是说,在一个文件中定义的外部变量,在其他的文件中只需要进行说明即可。(可见,外部变量的定义和说明不是一回事)。

  • 外部静态变量  该静态函数被定义在函数体外,故称为“外部静态变量”,定义时数据类型前加说明符“static”。该类变量的作用域为文件级的,但它在其它文件中是存在的(寿命存在于整个程序)。因此我们可以总结一下:静态类的变量(外部和内部),其存在性和可见性是不一致的。



相关例题


典:  该程序由三个文件组成,编译时要生成一个项目文件。

文件 1(main.cpp)

#include  < iostream.h >
void fun1(),fun2(),fun3;
int i(5);
void main()
{
  i=20;
  fun 1();
  cout<<"main():i="<<i<<endl;
  fun 2();
  cout<<"main():i="<<i<<endl;
  fun 3();
  cout<<"main():i="<<i<<endl;
}

文件 2(file1.cpp)
#include <iostream.h >
static int i;
void fun 1()
{
  i=50;
  cout<<""fun1():i(static)="<<i<<endl;
} 

文件 3(file2,cpp)
#include <iostream.h >
void fun2()
{
  int i=15;
  cout<<"fun2():i(auto)="<<i<<endl;
  if(i)
  { extern int i;
    cout<<"fun2():i(extern)="<<i<<endl;}
}
extern int i;
void fun3()
{
  i=30;
  cout<<"fun3():i(extern)="<<i<<endl;
  if(i){int i=10;
  cout<<"fun3():i(auto)="<<i<<endl;}
}

————————————
该例题答案:
fun 1():i(static)=50
main():i=20
fun 2():i(auto)=15
fun 2():i(extern)=20
main():i=20
fun 3():i(extern)=30
fun 3():i(auto)=10
main():i=30
// 答案核对,确已无误。

猜你喜欢

转载自blog.csdn.net/weixin_45283376/article/details/100572784
今日推荐