zoukankan      html  css  js  c++  java
  • 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
    

    这样可以将每个头文件所依赖的其他头文件包含进来

  • 相关阅读:
    java扫描文件夹下面的所有文件(递归与非递归实现)
    JAVA8 十大新特性详解
    Intellij IDEA创建的Web项目配置Tomcat并启动Maven项目
    Spring官网下载各版本jar包
    史上最全Java面试题(带全部答案)
    深入JVM对象引用
    23种设计模式全解析
    git difftool和mergetool图形化
    Java技术——你真的了解String类的intern()方法吗
    动手实现一个vue中的模态对话框组件
  • 原文地址:https://www.cnblogs.com/yujianfei/p/7857143.html
Copyright © 2011-2022 走看看