C语言----C语言中static的用法

简介: C语言----C语言中static的用法

【原文链接】

使用static修饰局部变量

(1)首先看如下代码,test函数中的变量a未使用static修饰,从执行结果可以看出,每次调用test函数的时候,a都会重新初始化

#include <stdio.h>

void test()
{
    int a = 1;
    printf("a = %d\n", a);
    a++;
}

int main()
{
    int i = 0;
    while (i < 5)
    {
        test();
        i++;
    }
}

执行结果为:

a = 1
a = 1
a = 1
a = 1
a = 1

(2)下面的代码,即对test函数中a变量使用static声明,通过结果可以发现,在后续的调用test的函数的时候,并没有每次都去初始化a,通过调试可以发现,除了第一次调用test之外,后面每次调用test,都会直接跳过使用static声明a的这一行代码

#include <stdio.h>

void test()
{
    static int a = 1;
    printf("a = %d\n", a);
    a++;
}

int main()
{
    int i = 0;
    while (i < 5)
    {
        test();
        i++;
    }
}

执行结果如下:

a = 1
a = 2
a = 3
a = 4
a = 5

(3)结论:

使用static声明局部变量,实质是延长了变量a的声明周期

使用static修饰全局变量

(1)首先看如下代码,即没有static修饰时的全局变量的使用,创建两个.c文件,如test.c和test2.c,首先在test1.c中定义一个全局变量

int age=20;

然后在test.c文件中编写如下代码,即在test.c文件中声明age为外部变量,然后直接调用age

#include <stdio.h>


int main()
{
    extern int age;
    printf("age=%d\n", age);
    return 0;
}

test.c执行结果为:

age=20

然后再test2.c中对全局变量age使用static修饰,test2.c代码如下:

static int age = 20;

test.c保持不变,然后执行test.c,此时报如下错误,即此时已经找不到全局变量age了

error LNK2001: 无法解析的外部符号 _age

(2)结论

对全局变量使用static修饰后,则此变量仅可以在当前文件中使用,即减小了变量的作用域范围

使用static修饰函数

(1)首先看在不适用static修饰的时候的情况,创建两个文件,在test2.c中编写如下函数,未使用static修饰

int add(int x, int y)
{
    return x + y;
}

然后在test.c文件中编写如下代码

#include <stdio.h>


int main()
{
    extern int add(int, int);
    int sum = add(100, 200);
    printf("sum= %d\n", sum);
    return 0;
}

执行test.c的结果为:

sum= 300

(2)然后对test2.c文件中的add函数使用static修饰,即:

static int add(int x, int y)
{
    return x + y;
}

test.c中的代码不做修改,此时运行会出现如下错误,即此时在test.c文件中函数add也变为不可见了

error LNK2019: 无法解析的外部符号 _add,该符号在函数 _main 中被引用

(3)结论:
使用static修饰函数跟修饰全局变量的作用类似的,即当一个函数被static修饰后,在此函数的作用域即被修改为仅对当前文件可见,在其他文件中则不可以继续调用了

static使用总结

  • static修饰局部变量,可以延长局部变量的声明周期,带有static修饰的行只会执行一次
  • static修饰全局变量,缩小了全局变量的作用域范围,修改为仅在当前文件中可见
  • static修饰函数,同样缩小了函数的作用域范围,修改为此函数仅对当前文件可见
目录
相关文章
|
2月前
|
C语言
C语言判断逻辑的高阶用法
在C语言中,高级的判断逻辑技巧能显著提升代码的可读性、灵活性和效率。本文介绍了六种常见方法:1) 函数指针,如回调机制;2) 逻辑运算符组合,实现复杂条件判断;3) 宏定义简化逻辑;4) 结构体与联合体组织复杂数据;5) 递归与分治法处理树形结构;6) 状态机管理状态转换。通过这些方法,可以更高效地管理和实现复杂的逻辑判断,使代码更加清晰易懂。
229 88
|
5月前
|
C语言
【C语言】:static和extern的详细介绍和使用
【C语言】:static和extern的详细介绍和使用
43 1
|
1月前
|
C语言 C++
C 语言的关键字 static 和 C++ 的关键字 static 有什么区别
在C语言中,`static`关键字主要用于变量声明,使得该变量的作用域被限制在其被声明的函数内部,且在整个程序运行期间保留其值。而在C++中,除了继承了C的特性外,`static`还可以用于类成员,使该成员被所有类实例共享,同时在类外进行初始化。这使得C++中的`static`具有更广泛的应用场景,不仅限于控制变量的作用域和生存期。
54 10
|
3月前
|
存储 缓存 编译器
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(下篇)
scanf处理⽤⼾输⼊的原理是,⽤⼾的输⼊先放⼊缓存,等到按下回⻋键后,按照占位符对缓存进⾏解读。 解读⽤⼾输⼊时,会从上⼀次解读遗留的第⼀个字符开始,直到读完缓存,或者遇到第⼀个不符合条件的字符为⽌。
168 2
|
3月前
|
存储 C语言
【C语言篇】scanf和printf万字超详细介绍(基本加拓展用法)(上篇)
printf 的作⽤是将参数⽂本输出到屏幕。它名字⾥⾯的 f 代表 format (格式化),表⽰可以定制输出⽂本的格式。
80 1
|
3月前
|
存储 C语言
【C语言函数】static和extern关键字修饰
【C语言函数】static和extern关键字修饰
|
5月前
|
存储 C语言
c语言scanf函数用法
c语言scanf函数用法
|
5月前
|
存储 C语言
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
C语言学习记录——联合体(共用体、特点、用法、联合体大小计算)
79 2
|
4月前
|
存储 C语言
C语言中static关键字的作用与用法解析
C语言中static关键字的作用与用法解析
|
5月前
|
程序员 C语言
C语言memcpy()函数用法
C语言memcpy()函数用法