一个C语言变量的作用域可以是代码块 作用域,函数作用域或者文件作用域。

不推荐写法

int a; // 出现了语法的二义性,可能是声明也可能是定义,所以最好定义完成之后声明

void func(); // 出现了语法的二义性,可能有参数,也可能没参数

推荐写法(严谨写法)

int a = 0; // 明确的定义了一个变量

extern int a; // 明确的声明了一个变量,使用extern关键字明确声明一个变量

void func(void); // 明确的声明了一个函数没有任何参数

1.auto自动变量

一般情况下代码块内部定义的变量都是自动变量。当然也可以显式的使用auto关键字,代码块之内的变量都可以称作auto变量代码块之外的变量叫全局变量。所有auto变量的生命周期就是变量所在的大括号。

auto int a;

2.register寄存器变量

通常变量在内存当中,如果能把变量放到CPU的寄存器里面,代码执行效率会更高。

register int i;

3.代码块作用域内的静态变量

静态变量是指内存位置在程序执行期间一直不改变的变量,一个代码块内部的静态变量只能被这个代码块内部访问

static int i = 0; // 定义一个静态变量

静态变量在程序刚加载到内存的时候就出现,所以和定义静态变量的大括号无关,所以一直到程序结束的时候才从内存消失,同时静态变量的值只初始化一次。

4.代码块作用域外的静态变量

代码块之外的静态变量在程序执行期间一直存在,但只能被定义这个变量的文件访问,在其它文件中不能被访问,即使是使用extern声明了也不行

因为全局变量的名字是不能相同的,这样会带来一个什么问题呢?因为一个项目往往是多人写的,每个人都定义自己的全局变量,最后代码合并后会出错。但static的全局变量在不同的文件中名字是可以相同的。

5.全局变量

全局变量的存储方式和静态变量相同,但可以被多个文件访问,定义在代码块之外的变量,就是全局变量。

6.外部变量与extern关键字

extern int i; // 声明一个变量,这个变量已经在别的文件中定义了,这里只是使用,而不是定义

7.全局函数与静态函数

在C语言中函数默认都是全局的,使用关键字static可以将函数声明为静态。一旦一个函数定义为static,就意味着这个函数只能在定义这个函数的文件中使用,即使在其它文件中声明这个函数都没有用。

对于不同文件中的static函数名字可以相同。

示例1:auto变量使用Demo

#include <stdio.h> // 这个头文件在系统目录下
#include <stdlib.h> // 使用了system函数
#include <Windows.h> // auto 变量使用Demo
void autoVariableUseDemo(void); int main() { for (int i = ; i < ; i++) {
autoVariableUseDemo();
//staticVariableUseDemo();
} //printf("z=%d\n",z); system("pause");
return ; } void autoVariableUseDemo(void) { auto int n = ;
n++;
printf("n=%d\n",n); }

输出结果

 示例2:static 变量使用Demo

#include <stdio.h> // 这个头文件在系统目录下
#include <stdlib.h> // 使用了system函数
#include <Windows.h> // static变量使用Demo
void staticVariableUseDemo(void); int main() { for (int i = ; i < ; i++) {
//autoVariableUseDemo();
staticVariableUseDemo();
} //printf("z=%d\n",z); system("pause");
return ; } void staticVariableUseDemo(void) { static int n = ;
n++;
printf("n=%d\n",n);
}

输出结果

C语言基础(17)-作用域的更多相关文章

  1. C++语言基础(17)-运算符重载

    运算符重载的格式为: 返回值类型 operator 运算符名称 (形参表列){ //TODO: } 一.在类里面实例运行符重载 #include <iostream> using name ...

  2. GO学习-(17) Go语言基础之反射

    Go语言基础之反射 本文介绍了Go语言反射的意义和基本使用. 变量的内在机制 Go语言中的变量是分为两部分的: 类型信息:预先定义好的元信息. 值信息:程序运行过程中可动态变化的. 反射介绍 反射是指 ...

  3. day02<Java语言基础+>

    Java语言基础(常量的概述和使用) Java语言基础(进制概述和二,八,十六进制图解) Java语言基础(不同进制数据的表现形式) Java语言基础(任意进制到十进制的转换图解) Java语言基础( ...

  4. JS基础学习——作用域

    JS基础学习--作用域 什么是作用域 变量的作用域就是变量能被访问到的代码范围,比如在下面的这个js代码中,变量a的作用域就是函数foo,因此在全局作用域内的console.log(a)语句不能访问到 ...

  5. [08 Go语言基础-for循环]

    [08 Go语言基础-for循环] 循环 循环语句是用来重复执行某一段代码. for 是 Go 语言唯一的循环语句.Go 语言中并没有其他语言比如 C 语言中的 while 和 do while 循环 ...

  6. JavaScript基础---语言基础(1)

    写在前面: 通过四篇博客把JS基础中的基础整理一下,方便自己查阅,这些内容对于实际项目开发中也许并不会在意,但是作为JS的语言基础,自觉还是应该熟悉.在完成这三篇博客(JavaScript基础---语 ...

  7. php面试题之三——PHP语言基础(基础部分)

    三.PHP语言基础 1. strlen( )与 mb_strlen( )的作用分别是什么(新浪网技术部) strlen和mb_strlen都是用于获取字符串长度. strlen只针对单字节编码字符,也 ...

  8. Object Pascal 语言基础

    Delphi 是以Object Pascal 语言为基础的可视化开发工具,所以要学好Delphi,首先要掌握的就是Object Pascal 语言.Object Pascal语言是Pascal之父在1 ...

  9. Java之--Java语言基础组成—函数

    Java语言基础组成-函数 Java语言由8个模块构成,分别为:关键字.标识符(包名.类名.接口名.常量名.变量名等).注释.常量和变量.运算符.语句.函数.数组. 本片主要介绍Java中的函数,函数 ...

随机推荐

  1. 前端设计师必须知道的10个重要的CSS技巧

    对于一个初入门的前端设计师,在设计修改网站前端的时候,我们需要编写一些CSS.JS的内容达到界面效果.今天分享10个对于前端设计师来说重要的CSS技巧,这也是我在给许多客户做网站的过程当中总结出来的. ...

  2. small test on 5.29 night T1

    可以发现题目的重点是在第一个部分,因为只要信心值我们求出来了,那么第二问就是一个简单的最长上升子序列问题了,所以接下来只讲第一问. #include<iostream> #include& ...

  3. cookie的secure、httponly属性设置

    cookie的secure.httponly属性设置 转载自:http://www.cnblogs.com/alanzyy/archive/2011/10/14/2212484.html 一.属性说明 ...

  4. Linux发布Tomcat Web项目

    1.打包项目,项目右键–>Export –> WAR file 2.将.war文件放到tomcat下的webapps下.重启tomcat即可. ps  afux    —  查看进程 ki ...

  5. TELNET终端类型选项

    转:http://www.cnpaf.net/Class/Telnet/200408/5.html 1. 命令名称及编号TERMINAL-TYPE242.命令含义IACWILLTERMINAL-TYP ...

  6. 【转】谈基于SOA的应用系统设计和开发

    注:在网上看到这篇文档,觉得写得很好,清晰实用.该博客其它文章也写得不错     地址:http://blog.sina.com.cn/s/blog_493a84550101gswn.html 现在对 ...

  7. 一个简单的假vue全家桶(vue+vue-router+require)

    首先说明我觉得这是一个比较好理解的vue全家桶(虽然是假的),模块化也是用require来做的,而且如果后期有必要压缩我也会用gulp来做 1.依赖个个本地模块,require只是用来载入page,这 ...

  8. OneThink框架的文章详情页分页

    Application/Home/Controller/ArticleController.class.php的detail函数修改结果如下: /* 文档模型详情页 */public function ...

  9. DELPHI黑客编程(一):正向后门原理实现

    前言 在渗透测试中经常用到远控.后门等辅助后渗透权限维持工具,有一款好用的自制后门可以在巩固渗透成果方面有很大的帮助.今天给大家简单讲解下后门的原理和实现的方法,主要针对技术研究和原理演示,请各位看官 ...

  10. apache poi合并单元格设置边框

    HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //创建一个样式 HSSFCellStyle sty ...