C语言函数与程序结构
title : C语言函数与程序结构
tags : C语言作用域规则 , 外部变量 ,静态变量 ,寄存器变量,宏定义
grammar_cjkRuby: true
外部变量
变量声明用于说明变量的属性(类型),而变量定义还会引起存储器分配
int sp;
double s[MAX];
声明地方:函数外
如果上面的变量定义在所有函数之外,即为外部变量,并为这两个外部变量sp、s[MAX],分配储存单元以及数组的长度,在其源文件中的所有函数都可以使用这两个外部变量。
extern int sp;
extern double s[MAX];
为该源文件声明两个外部变量sp、s[MAX],不同的是这两个变量的长度在源程序的其他源文件中定义,没有再重新建立变量和分配储存单元。
源程序的所有源文件中,一个外部变量只能在某一个文件中声明,而其他地方不能再定义一个
相同的外部变量,如果要使用该变量可以通过extern声明进行访问。
外部变量定义的地方必须指明数组的长度。
静态变量
static int sp;
static double s[MAX];
声明地方:函数外,函数内
将sp、s[MAX]这两个外部变量声明为静态变量,除了该源文件内的函数可以访问sp、s[MAX],但是其他文件不可以通过extern访问静态变量sp和s[MAX]。
同样static同样也可以声明自动变量(在函数内部定义使用的变量),不过不同于其他内部变量,该变量不管其所在函数是不是被主函数调用,它一直存在不会随着所在函数被调用退出之后而消失,也就是说用static定义的内部变量只能在特定的函数内有自己独立的储存空间。
寄存器变量
register int sp;
register double s[MAX];
声明地方:函数内以及函数的形参
register的作用是告诉编译器,它声明的变量在程序中使用的频率较高,把声明的变量放在机器的寄存器中,这样会使程序更小、执行速度更快
程序块
while(***){
int i=1;
if(***){
……
}
……
}
花括号包括的语句就是一个程序块,在其中声明的变量会隐藏程序块以外的同名变量,该程序块内声明的变量和之外的变量无关,同样静态变量只会被初始化一次。
初始化
外部变量不进行初始化的话会直接初始化为0,而自动变量和局部变量没有进行初始化的话则视为没有定义(无用的信息)。
外部变量的初始化定义必须为常量表达式,不能包含其他已经定义的变量,相反自动变量和局部变量则可以包含
对于数组的初始化,外部变量的声明中如果后面的初始化表达式个数小于元数,那直接把多的元素初始化为0,相反对于局部变量则会引发错误
字符串数组声明比较特殊,可以直接用""来代替{}
C语言预处理器
#include " "和#include< >的区别
#include(文件包含指令)使得处理大量的#define指令以及声明更加方便,使得源文件里直接包含文件名指定的文件内容。
#include " "在源文件所在的位置查找该文件,如果没查找到该文件则根据相应规则查找该文件,
#include< >直接根据相应规则查找该文件
宏替换
#define 名字 文本将出现名字的地方都会被替换为文本,可以将较长行分为若干行,只需在待续行的末尾加上反斜杠\即可
#define宏定义的作用域是从定义点开始,然后一直到源文件的结尾
#define宏定义的不能对引号里面的字符串有用,如printf("YES")
#udef取消宏定义
#define也可以带上参数,这样就可以像实际参数一样,#define max(a,b) (a)>(b) ? (a) : (b)
条件包含
使用条件语句对预处理的语句进行判断,在预处理执行的过程中进行运算,可以在编译过程中根据计算所得的条件值选择性的包含不同的代码提供手段。
#if !defined(名字)……
#else / #endif / #elif……
defined(名字)表示当名字被定义,其值为1;否则,其值为0
#if !defined(HDR)
#define HDR
#endif
这样可以将每个头文件所依赖的其他头文件包含进来
C语言函数与程序结构的更多相关文章
- C/C++语言简介之程序结构
C语言的模块化程序结构用函数来实现,即将复杂的C程序分为若干模块,每个模块都编写成一个C函数,然后通过主函数调用函数及函数调用函数来实现一大型问题的C程序编写,因此常说:C程序=主函数+子函数.因此, ...
- C语言函数不能返回数组,但可以返回结构体
为什么C语言函数可以返回结构体,却不可以返回数组?有这样的问题并不奇怪,因为C语言数组和结构体本质上都是管理一块内存,那为何编译器要区别对待二者呢? C语言函数为什么不能返回数组? 在C语言程序开发中 ...
- JavaScript初探 四 (程序结构)
JavaScript 结构 JavaScript 程序结构 JavaScript支持几乎和C语言一样的程序结构 分支结构 循环结构 分支结构 条件分支 if-else if语句:判断条件为true则执 ...
- 【C语言入门教程】1.1 基本程序结构
基本程序结构就是从上至下顺序执行的程序,C语言程序必须有且只有一个主函数,程序从主函数开始执行,直到主函数结束.下例是根据半径求圆形面积的程序源代码. #include <stdio.h> ...
- 菜鸟学习-C语言函数参数传递详解-结构体与数组 分类: C/C++ Nginx 2015-07-14 10:24 89人阅读 评论(0) 收藏
C语言中结构体作为函数参数,有两种方式:传值和传址. 1.传值时结构体参数会被拷贝一份,在函数体内修改结构体参数成员的值实际上是修改调用参数的一个临时拷贝的成员的值,这不会影响到调用参数.在这种情况下 ...
- 网易云课堂_C语言程序设计进阶_第6周:程序结构
6.1 全局变量 6.2 编译预处理 6.3 大程序结构 6.1 全局变量 全局变量 定义在函数外面的变量是全局变量 全局变量具有全局的生存期和作用域 它们与任何函数都无关 在任何函数内部都可以使用它 ...
- [C语言]进阶|程序结构
------------------------------------------------------------------------------------ 全局变量: // main.c ...
- GO语言的进阶之路-go的程序结构以及包简介
GO语言的进阶之路-go的程序结构以及包简介 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.编辑,编译和运行 A,编辑 Go程序使用UTF-8编码的纯Unicode文本编写.大 ...
- C语言入门教程-(2)基本程序结构
1.简单的C语言程序结构 要建造房屋,首先需要打地基.搬砖搭建框架(这大概就是为什么叫搬砖的原因).学习计算机语言的时候也一样,应该从基本的结构开始学起.下面,我们看一段简单的源代码,这段代码希望大家 ...
随机推荐
- Python实战之文件操作的详细简单练习
['_CHUNK_SIZE', '__class__', '__del__', '__delattr__', '__dict__', '__dir__', '__doc__', '__enter__' ...
- python中ConfigParse模块的用法
ConfigParser 是Python自带的模块, 用来读写配置文件, 用法及其简单. 配置文件的格式是: [...]包含的叫section section 下有option=value这样的键值 ...
- DataGrid 如何得到DataGridRow 和DataGridCell 对象
第一行为不可编辑 DataGridRow row = (DataGridRow)dataGrid1.ItemContainerGenerator.ContainerFromIndex(0); ...
- IIS ApplicationPoolIdentity(配置IIS讀寫網站文件)
原创地址:http://www.cnblogs.com/jfzhu/p/4067297.html 转载请注明出处 从IIS 7.5开始,Application Pool Identity的Built- ...
- IDEA搭建SpringMVC+Mybatis+Mysql+Maven框架
相关环境 Intellij IDEA Ultimate Tomcat JDK MySql 5.6(win32/win64) Maven (可使用Intellij IDEA自带的) 搭建步骤 创建项目工 ...
- 【ASP.NET MVC 学习笔记】- 20 ASP.NET Web API
本文参考:http://www.cnblogs.com/willick/p/3441432.html 1.ASP.NET Web API(本文简称Web API),是基于ASP.NET平台构建REST ...
- 容器与Docker简介(二)什么是DOCKER——微软微服务电子书翻译系列
Docker是一个开源项目,用于将应用程序部署自动化,作为可在云端或本地运行的可移植,自包含的容器. Docker同时也是一家促进和发展这项技术的公司,与云,Linux以及Windows的供应商(包括 ...
- Azure 基础 : 使用 template 简化部署
笔者在前文中介绍了如何使用 PowerShell 脚本在 Azure 上创建虚拟主机.正如你所看到的,整个创建过程还是有点繁琐的,因为我们需要使用 PowerShell 脚本创建并关联所有相关的组件. ...
- linux下使用crontab实现定时PHP计划任务失败的原因分析
这篇文章主要介绍了linux下使用crontab实现定时PHP计划任务失败的原因分析,需要的朋友可以参考下 很多人在linux下使用crontab实现PHP执行定时任务却未能成功,不能生成缓存.本 ...
- nginx虚拟机配置(支持php)
由于本人水平有限,以下记录仅作参考. 下面贴出我的一份正常运行的nginx服务器虚拟机配置./usr/local/nginx/conf/vhost/www.xsll.com.conf server { ...