• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

C/C++(变量作用域)

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

变量的作用域

凡是在{}以内的变量为局部变量,也包括形式参数。

凡是{}外的变量为全局变量

作用域:

{}以内的作用域为局部作用域,主要包含的事变量

{}以外的作用域为全局作用域,包含的是变量和函数

同一作用域内,不可以用重命名的变量
局部变量的作用域,起始于定义处,直到所在的大括号处结束。
全局变量的作用域,起始与定义处,知道本文件结束。

作用域叠加:

全局变量同局部变量的作用域叠加,在不同的作用域中,可以有重名的标识符,局部变量会覆盖全局变量的作用域。

#include<stdio.h>
int a = 100;
int main() {
    int a = 10;
    printf("a = %d\n",a);//10
    return 0;
}

更小的作用域{}只能再次划分局部作用域

#include<stdio.h>
int a = 100;
int main() {
    int a = 10;
    {//只能用于局部
        int a = 1;
        printf("a = %d\n",a);//1
    }
    return 0;
}

全局变量命名污染

函数是全据变量,要防止命名污染,全局变量的使用更要避免命名重名。尽量少用全局变量。

局部变量的生命周期

函数的生命周期起始与调用,结束与调用结束。函数体内的局部变量相同。
main函数比较特殊它开始于程序的开始,结束语程序的结束

全局变量的生命周期

全局变量的生命周期起始与main函数的调用,结束于main函数的结束,等价于程序的生命周期。
main函数中的变量生命周期与全局变量相同,但他们的作用域不同

修饰符

auto类型

只能用于修饰局部变量,表示该变量存储在栈上stack
特点:随用随开,用完消失
默认的局部变量,就是auto类型,所以通常将其省略。C++中auto是自动变量。
eg:

auto int a = 23;

register

只能修饰局部变量,将内存中的变量升级到cpu寄存器中存储,这样访问速度会很快。存储cpu的变量,速度快但数量有限,通常用来优化。用于频繁使用的变量。一般不用。

extern(通关文牒)

修饰全局变量,
c语言是订单文件编译,然后再将编译的.o文件同库仪器连接成可执行文件,所以跨文件需要声明。
区分声明预定义:extern可以省略,不建议省略
eg:

int a;//声明
int a = 120;//定义

全局变量声明未定义时是0,局部变量是随机数。vs中是不行的。局部变量必须定义。

static(隔离出境)

static修饰局部变量,默认初始化0

#include<stdio.h>
void func();
int main() {
    for(int i = 0;i < 10;i++) {
        func();
    }
    return 0;
}
void func() {
    int a = 1;//默认auto修饰,存储在栈中即用即消失,所以每次用完消失++操作无效。
    printf("a = %d\t",a++);
    static int b = 1;//修饰的局部变量存放在data块中,生命周期等同与进程。 
    //无论以后调用多少次函数,它的初始化一次
    printf("b = %d\n",b++);
    printf("++++++++++++++++++");
}
/*
a = 1   b = 1
++++++++++++++++++
a = 1   b = 2
++++++++++++++++++
a = 1   b = 3
++++++++++++++++++
a = 1   b = 4
++++++++++++++++++
a = 1   b = 5
++++++++++++++++++
a = 1   b = 6
++++++++++++++++++
a = 1   b = 7
++++++++++++++++++
a = 1   b = 8
++++++++++++++++++
a = 1   b = 9
++++++++++++++++++
a = 1   b = 10
++++++++++++++++++
*/

static修饰的变量存储在data区域中,生命周期等同于进程,和函数的作用域无关

#include<stdio.h>
void print(int num,int age,char sex,float score);
int main() {
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
    print(1001,32,'x',99);
}
void print(int num,int age,char sex,float score) {
    static int flag = 1;
    if(flag == 1) {
        printf("num\tage\tsex\tscore\tcount\n");
        flag = 0;
    }
    static int count = 0;
    printf("%d\t%d\t%c\t%.2f\t%d\n",num,age,sex,score,++count);
}
//控制执行次数,记录打印某函数的调用次数多用于避免多次加载的资源

全局变量会带来命名污染,好处(全局可用,避免传参),用static解决。一个全局变量拥有外延性,可以被其他的文件所用,extern。static修饰全局变量以后,外延性消失,变成本文件内部的全局变量
main.c

static int a = 100;

bb.c

static int a = 200;

这样两者文件中的a都限制在本文件中
main.c

extern a;
printf("a = %d\n",a);//报错,编译不通过

bb.c

static int a = 200;//限制了外延性,成了局部变量

同样适用于函数
全局变量被static修饰后,存放的位置没有变,改变的了作用域,外延性被限制。


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
AxisJava调C#Webservice发布时间:2022-07-14
下一篇:
C++笔记(5)——浮点数的比较发布时间:2022-07-14
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap