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数据可视化利器Matplotlib,绘图入门篇,Pyplot介绍
Pyplot matplotlib.pyplot是一个命令型函数集合,它可以让我们像使用MATLAB一样使用matplotlib.pyplot中的每一个函数都会对画布图像作出相应的改变,如创建画布.在 ...
- ABP增删改查代码片段
@using System.Web.Optimization @using MultiPageSimpleTask.Entitys.Dtos; @model IList<ProductDto&g ...
- java通过shield链接Elasticsearch
本文mark了springboot中集成elasticsearch,并且实现连接带有shield权限管理的elasticsearch的方法. tips:首先建议java client版本和elasti ...
- WCF的客户端与服务端
服务端 : 1.新增一个Winform的服务端 2.选择以上建的项目,增加一个WCF服务 3.定义三个方法,一个不返回结果不带参数.返回结果带参数.返回结果以类的方式传递参数 4.Service1继承 ...
- 超全面!这可能是最全面的 jQuery 知识总结
个人建议:学习 jQuery 前先掌握基本的 JavaScrpit 语法,特别是对函数要掌握,jQuery 基本上是使用函数. jQuery 简介 jQuery 是一个轻量级 JavaScript 库 ...
- DevOps之唠叨话
唠叨话 教学:人类培养态度.传授知识.训练技能的活动. 教学手册(Teaching Manual) 教学形式:教材与课程,师生(一对一.一对多).教学内容:系统框架和问答机制,结构(前言.目录.正文. ...
- scala中的Type使用
trait Base { val name: String } case class S( name: String, age: Int ) extends Base case class F( na ...
- TensorFlow问题:The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available on your machine and could speed up CPU computations.
1. 问题描述 The TensorFlow library wasn't compiled to use SSE4.2 instructions, but these are available o ...
- WebService的简单运用添加删除
WebService是一种跨编程语言和跨操作系统平台的远程调用技术,简单来说就是将数据存储到项目的文件夹下 .NET中基于DOM核心类 XmlDocument 表示一个XML文档 XmlNode表示X ...
- eval函数的坑
开发工作中遇到这样一种情形,需要执行用户输入的php代码串,于是决定使用eval函数.coding大概示例如下: function getStr($str) { return strlen($str) ...