各位看官们,大家好,上一回中咱们说的内置宏的样例。这一回咱们说的样例是:static关键字。

闲话休提。言归正转。

让我们一起talk C栗子吧!

看官们,C语言提供了static关键字。它常常出如今变量或者函数的最前面。为什么要加上它呢?它主要有什么作用呢?今天我们一起来了解static关键字。

在介绍之前。我们先做一些铺垫。主要是介绍一下变量或者函数的生命周期和作用域。

变量和函数的生命周期

所谓的生命周期就是指变量或者函数在程序中能够被使用的时间。它是一段时间,可能是一分钟或者一小时等。生命周期通常从開始使用变量的时间算起。直到结束使用变量为止。在这个时间段内的时间就叫作变量的生命周期。这有点相似自然界的春夏秋冬,每年都是从春天開始,直到冬天结束。从春天到冬天的这个过程就是一个周期,仅仅是我们习惯叫这个周期为一年。

C语言中的变量有全局变量和局部变量。全局变量的生命周期和程序的生命周期同样。也就是说全局变量贯穿于整个程序的执行过程。局部变量的生命周期没有这么长,它仅仅在须要使用它的时候才開始出现。使用完毕后,它完毕了自己的使命,进而结束生命。

最常见的是函数中的变量,这些变量都是局部变量,它们随着函数的执行而開始,函数执行结束后,它们也会消失。

接下来我们举一个实际的样例来说明变量的生命周期:

int globle_value = 1;

void func()
{
int local_value = 3; printf("globle_value = %d \n",globle_value); //在该函数中能够使用全局变量
printf("local_value = %d \n",local_value); //在该函数中能够使用局部变量 } int main()
{
func();
printf("globle_value = %d \n",globle_value); //在主函数中能够使用全局变量
//printf("local_value = %d \n",local_value); //在主函数中不能使用局部变量 return 0;
}

我们把上面的代码保存到一个文件里,而且编译该文件,然后执行编译后的程序。程序的执行结果例如以下:

globle_value = 1    //在func函数中能够使用全局变量
local_value = 3 //在func函数中能够使用全局变量
globle_value = 1 //在main函数中仅仅能使用全局变量

从上面的样例中能够看到,全局变量在自己定义的func函数和主函数中都能够被使用,由于它的生命周期和程序的生命周期同样。而局部变量仅仅能在func函数中使用。不能在主函数中使用,假设去掉程序中的凝视那么就会产生“变量没有定义”的编译错误。原因在于局部变量随着func函数的结束而结束,因此在主函数中看不到局部变量。

变量和函数的作用域

变量的作用域表示变量的有效使用范围。变量在某个范围内能够被使用。出了这个范围外就不能被使用了。比方我们日常生活中的身份证。在国内能够任意使用,可是出国后就不能使用了,仅仅能使用护照。这是由于身份证的作用域是国内,出国后就表示超出了身份证的作用域范围。这时就不能再使用身份证了。

我们还使用上面的样例进行说明:

  • 全局变量globle_value的作用域是整个文件,因此它能够被同一个文件里的func函数和main函数訪问。

  • 局部变量local_value的作用域是函数func内部。因此它仅仅能在func函数内使用。在其他地方不能使用。由于已经超出了它的作用域。

有了这些铺垫后,我们介绍static关键字就easy多了,static关键字主要有两个功能:限定变量或者函数的生命周期和作用域。

对于变量来说,static不会影响它的生命周期。仅仅是会把未初始化的变量初始化为0。只是它会缩小变量的作用域,这个对局部变量没有影响,主要是把全局变量的作用域缩小到一个文件里,比方我们在上面样例中的全局变量globle_value,它能够在其他文件里使用,假设把它使用static关键字限定后,它就仅仅能在当前的文件里使用了。

以下是一个实际的样例。请大家參考:

static void func()
{
int temp;
static int static_local_value ; printf("temp = %d \n",temp); // default value is not known
printf("static_local_value = %d \n",static_local_value); // default value is 0 }

我们在函数func中定义一个普通变量和static修饰的变量,而且都没有初始化它们。编译时会把static变量初始化为0,而不会初始化普通变量。以下是程序的执行结果。请參考:

temp = 134513922
static_local_value = 0

从上面的程序执行结果中能够看到,static变量的默认值是0,而普通变量的默认值是不确定的。

对于函数来说,static不会影响它的生命周期。可是会缩小它的作用域,这点和static限定变量时的效果同样。因此。我就不多介绍了。

看官们。完整的代码放到了我的资源中。大家能够点击这里下载使用。

在编写代码的时候,我们常常使用static来限定变量和函数,主要是为了把它们的作用域缩小到一个文件内。这样做能够避免和其他文件里同名的变量或者函数发生命名冲突。

打个比方。据说国内叫张伟的人特别多,也就是说重名的人非常多。假设我在这里叫张伟。那么可能仅仅有一个看官叫张伟,毕竟在这里听我讲小说的看官们人数不是非常多,假设我在网上发个帖子说:张伟中奖了。那么可能会有非常多叫张伟的人去领奖,怎样区分这么多张伟呢。使用static关键字来限定一下即可,哈哈。

各位看官,关于static关键字的样例咱们就讲到这里。

欲知后面还有什么样例,且听下回分解 。


一起talk C栗子吧(第一百二十六回:C语言实例--statickeyword)的更多相关文章

  1. 第一百二十六节,JavaScript,XPath操作xml节点

    第一百二十六节,JavaScript,XPath操作xml节点 学习要点: 1.IE中的XPath 2.W3C中的XPath 3.XPath跨浏览器兼容 XPath是一种节点查找手段,对比之前使用标准 ...

  2. 一起talk C栗子吧(第一百二十四回:C语言实例--内置宏)

    各位看官们,大家好,上一回中咱们说的是显示变量和函数地址的样例,这一回咱们说的样例是:内置宏.闲话休提,言归正转.让我们一起talk C栗子吧! 看官们,我们在编译程序的时候,假设有语法错误,编译器就 ...

  3. 第三百二十六节,web爬虫,scrapy模块,解决重复ur——自动递归url

    第三百二十六节,web爬虫,scrapy模块,解决重复url——自动递归url 一般抓取过的url不重复抓取,那么就需要记录url,判断当前URL如果在记录里说明已经抓取过了,如果不存在说明没抓取过 ...

  4. 第一百二十八节,JavaScript,Ajax

    JavaScript,Ajax 学习要点: 1.XMLHttpRequest 2.GET与POST 3.封装Ajax 2005年Jesse James Garrett发表了一篇文章,标题为:" ...

  5. 第一百二十五节,JavaScript,XML

    JavaScript,XML 学习要点: 1.IE中的XML 2.DOM2中的XML 3.跨浏览器处理XML 随着互联网的发展,Web应用程序的丰富,开发人员越来越希望能够使用客户端来操作XML技术. ...

  6. 第一百二十四节,JavaScriptCookie与存储

    JavaScriptCookie与存储 学习要点: 1.cookie 2.cookie局限性 3.其他存储 随着Web越来越复杂,开发者急切的需要能够本地化存储的脚本功能.这个时候,第一个出现的方案: ...

  7. 第一百二十节,JavaScript事件对象

    JavaScript事件对象 学习要点: 1.事件对象 2.鼠标事件 3.键盘事件 4.W3C与IE JavaScript事件的一个重要方面是它们拥有一些相对一致的特点,可以给你的开发提供更多的强大功 ...

  8. 第一百二十九节,JavaScript,理解JavaScript库

    JavaScript,理解JavaScript库 学习要点: 1.项目介绍 2.理解JavaScript库 3.创建基础库 从本章,我们来用之前的基础知识来写一个项目,用以巩固之前所学.那么,每个项目 ...

  9. 第一百二十三节,JavaScript错误处理与调试

    JavaScript错误处理与调试 学习要点: 1.浏览器错误报告 2.错误处理 3.错误事件 4.错误处理策略 5.调试技术 6.调试工具 JavaScript在错误处理调试上一直是它的软肋,如果脚 ...

随机推荐

  1. 单元测试 Qunit

    http://api.qunitjs.com/category/assert/    测试方法   选中 "Check for Globals" 会暴露全局对象,看你的代码会不会无 ...

  2. 【Kafka源码】ReplicaManager启动过程

    在KafkaServer启动过程的入口中,会启动Replica Manager,众所周知,这是一个副本管理器.replica在Kafka中扮演的角色很重要,是保证消息不丢失的一个重要概念. repli ...

  3. JAVA 的关键字 、

    关键字: 被JAVA语言赋予特定含义的单词, 特点: 组成关键字的单词的字母全部小写 注意: A:goto 和 const 是保留字 B: 类似于Notepad++ 这样的高级记事本,针对关键字有特殊 ...

  4. javaMybatis映射属性,高级映射

    映射文件的sql属性: id:标识符(一般都是dao层方法名) resultType:sql返回类型 resultMap:放回的映射类型 parameterType:参数类型 useGenerated ...

  5. 五:用JAVA写一个阿里云VPC Open API调用程序

    用JAVA写一个阿里云VPC Open API调用程序 摘要:用JAVA拼出来Open API的URL 引言 VPC提供了丰富的API接口,让网络工程是可以通过API调用的方式管理网络资源.用程序和软 ...

  6. 自定义view-滑动开关

    介绍 前段时间,我看到了一篇关于可滑动开关Switch组件的文章,效果图如下: 思路也挺简单的:这个控件主要由田径场式背景和滑块组成.他将田径场式背景分为3部分,最左边的半圆,中间的两条直线部分和最右 ...

  7. Linux系列教程(二十二)——Linux的bash变量

    上篇博客我们介绍了bash的一些基本功能,这是我们平时操作最频繁的.本篇博客我们介绍bash的变量,为后面编写shell脚本做铺垫. 1.什么是变量 变量是计算机内存的单元,其中存放的值可以改变. 当 ...

  8. [转载] Netty源码分析

    转载自http://blog.csdn.net/kobejayandy/article/details/11836813 Netty提供异步的.事件驱动的网络应用程序框架和工具,用以快速开发高性能.高 ...

  9. 【Java入门提高篇】Day1 抽象类

    基础部分内容差不多讲解完了,今天开始进入Java提高篇部分,这部分内容会比之前的内容复杂很多,希望大家做好心理准备,看不懂的部分可以多看两遍,仍不理解的部分那一定是我讲的不够生动,记得留言提醒我. 好 ...

  10. geotrellis使用(三十五)Cesium加载geotrellis TMS瓦片

    前言 做任何事情都不是想象中的那么简单.好久没有更新技术博客了,跟最近瞎忙有很大关系,虽说是瞎忙也抽空研究了些技术. 主要是前端渲染,像原生的WebGL和Cesium.WebGL写了几篇博客,自我感觉 ...