首页 > 其他分享 >C语言中静态函数和非静态函数的区别

C语言中静态函数和非静态函数的区别

时间:2023-11-02 14:22:06浏览次数:37  
标签:non 函数 静态 C语言 num static func

 

C语言中,静态函数和非静态函数的区别主要体现在以下方面:

  1. 可见性:静态函数只能在当前文件内使用,不能被其他文件调用,而非静态函数可以被当前文件以外的其他文件调用,具有全局可见性。

  2. 生命周期:静态函数在程序运行期间一直存在,不会被释放,而非静态函数则是在被调用时动态地创建并在函数返回时被释放,拥有较短的生命周期。

  3. 内存分配:非静态函数调用时从堆栈中动态分配内存空间,函数返回时空间被释放,而静态函数分配内存空间仅一次,且在程序运行期间一直存在,调用时并不会重新分配内存空间。

  4. 其他:静态函数不能被其他文件调用,因此可以被认为是一种信息隐藏方法,能够有效地维护代码的安全性。同时,在一些对性能要求较高的场景,静态函数相比非静态函数性能更好,因为静态函数的调用时间更短。

需要注意的是,静态函数和非静态函数的区别只在函数定义所在文件中有效,因此同一函数在不同文件中的定义可以是静态或非静态的,具体取决于定义该函数的程序员。

 

以下是一段简单的程序,用于演示静态函数和非静态函数的区别:

#include <stdio.h> 
 
void non_static_func() { 
    int num = 0; 
    printf("non_static_func num: %d\n", num); 
    num++; 
} 
 
static void static_func() { 
    static int num = 0; 
    printf("static_func num: %d\n", num); 
    num++; 
} 
 
int main() { 
    int i; 
    for (i = 0; i < 3; i++) { 
        non_static_func(); 
        static_func(); 
    } 
    return 0; 
} 

 

通过运行程序,我们可以看到以下结果:

non_static_func num: 0 
static_func num: 0 
non_static_func num: 0 
static_func num: 1 
non_static_func num: 0 
static_func num: 2 

 

我们可以看出,non_static_func函数每次被调用时,变量num的值始终为0,并没有被保留下来。而static_func函数每次被调用时,变量num的值可以被保留下来,并在下次调用时继续使用。这是因为static_func函数中的变量num是静态变量,其生命周期保持到程序结束,而non_static_func函数中的变量num是一个普通的自动变量,其生命周期仅限于函数调用过程中。

因此,我们可以看出,静态函数中的静态变量可以在多次函数调用之间保持变量值不变,而非静态函数中的变量则不会保留之前的值。这是静态函数与非静态函数的一个主要区别。

 

如果把静态函数里面的静态变量变成普通变量,那么打印会跟普通函数的一样。

标签:non,函数,静态,C语言,num,static,func
From: https://www.cnblogs.com/cyj22/p/17805304.html

相关文章

  • python @staticmethod 静态方法的使用
    `@staticmethod`是Python中的一个装饰器,用于将一个方法声明为静态方法。静态方法是一种不需要访问类实例的方法,可以直接通过类名调用,而不需要创建类的实例。静态方法的使用场景包括:1.辅助类或工具类:静态方法可以用于辅助其他类或提供一些通用的工具功能,而不需要与类的实例进......
  • spark代码示例---explode()炸裂函数使用
    数据结构,及bean的结构root|--eventName:string(nullable=true)|--itmeList:array(nullable=true)||--element:struct(containsNull=true)|||--did:string(nullable=true)|||--dno:long(nullable=true)|||--d......
  • Java 匿名函数的概念和写法
    匿名函数的实现1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口//1.定义一个函数式接口。只有一个抽象方法的接口就是函数式接口interfaceILike{voidhit(longparam);}没有类名,必须借助接口或父类通过实例化函数式接口就可以完成匿名内部类实现此接口......
  • C语言经典练习题1
    1、题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第了个人大2岁,问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?程序分析:利用递归的方法,递归分为回推和递推两个阶段。要想知道第五个人岁数......
  • OpenFunction 1.2.0 发布:集成 KEDA http-addon 作为同步函数运行时
    OpenFunction是一个开源的云原生FaaS(FunctionasaService,函数即服务)平台,旨在帮助开发者专注于业务逻辑的研发。我们非常高兴地宣布OpenFunction又迎来了一次重要的更新,即v1.2.0版本的发布!本次更新中,我们继续致力于为开发者们提供更加灵活和强大的工具,并在此基础上加入了......
  • Sql Server使用函数获取拼音码
    CREATEFUNCTIONFun_GetPY(@StrNVARCHAR(4000))RETURNSNVARCHAR(4000)ASBEGINDECLARE@WordNCHAR(1)DECLARE@PYNVARCHAR(4000)SET@PY=''WHILELEN(@Str)>0BEGINSET@Word=LEFT(@Str,1)--如果非汉字字符,返回原字符SET@PY=@PY+(CASEWHENUN......
  • axum处理静态文件
    和其它Web框架一样,axum也会对所有请求进行处理。对于CSS、JS及图片等静态文件,并不需要axum的handler进行处理,而是只需要简单的把它们的内容进行返回即可。axum提供了处理静态文件的中间件。首先,我们创建一个名为 static 的目录,并在其中创建一个 axum-rs.txt 的文......
  • Python基础入门:从Hello World到简单函数
    当然可以帮你写一篇Python基础入门的文章。下面是一篇题为《Python基础入门:从HelloWorld到简单函数》的原创文章,内容包括了Python的基本语法、变量、控制流以及简单函数的介绍。文章中也包含了相应的Python代码示例。Python基础入门:从HelloWorld到简单函数Python是一门简洁、易......
  • 2023牛客暑期多校训练营8 B Bloodline Counter 指数型生成函数 容斥 多项式求逆
    传送门容易想到求出竞赛图上最大环\(\lek\)的数量,再求出\(\lek-1\)的数量作差即可得到答案。设指数型生成函数\(G(x)\)表示大小为\(i\)的环的方案数。\(G(x)=\sum_{i=1}^k\frac{a_i}{i!}x^i\)那么最大环\(\lek\)的数量\(=[x^n]n!\sum_{i=1}^ki!\frac{(G(x))^i}{i!}\)这里......
  • http包中的ListenAndServe函数是阻塞式的
    packagemainimport( "fmt" "net/http")funcmain(){ fmt.Println("beforelisten") http.ListenAndServe(":1000",nil) fmt.Println("afterlisten")}执行结果为了避免ListenAndServe函数因监听端口而阻塞后面流程,需要开协程来执行该函数......