C程序设计语言学习第四章:函数与程序结构

第四章:函数与程序结构

作用域规则

  • 外部变量的声明必须指定数组长度,而extern声明使用外部变量却不用指定 数组长度

静态变量

  • 介绍: 被static修饰的变量或函数为静态变量或静态函数

  • 特点: 静态变量或者函数只能被本文件访问,外部不可以访问

寄存器变量

  • 使用register声明变量

  • 特点:思想是将使用频率高的变量放到寄存器中,从而使程序更小,运行速度更快

  • 注意事项:并不是你用register声明一个变量后,这个变量就是寄存器变量了,编译器会忽略过量的或者不支持的类型的寄存器变量声明,但是无论是不是最后放到寄存器中, 一旦使用register声明后,这个变量的地址都是不可访问的。

初始化

  • 在没有显式初始化的情况下,外部变量和静态变量被初始化为0,寄存器变量和自动变量的初值未定义即无意义的值。
  • 对于外部变量和静态变量来说,初始化表达式必须为常量表达式(因为在程序运行前就已经初始化了嘛,我是这样理解的)
  • 自动变量和寄存器变量则在每次进入函数中或程序块才被初始化

C预处理器

  • 文件包含

    • #include< 文件名>:该行声明处将被替换为文件名指定的文件的内容,如果在该位置没有找到文件也会按照相应的规则去查找文件

    • 注意事项: 如果某个被引用的文件内容发生了变化,那么所有依赖该文件的源文件必须重新编译

  • 宏替换

    • #define name 替换内容

    • 替换内容是name后所有内容,当内容过长时,可以在每行后面追加\换行

    • #define的作用域从定义开始到源文件结束

    • 宏替换可以是任意的:

      • 定义无限循环:#define forever for(;
    • 宏替换可以带参数:

      • #define max(A,B) (A > B ? A : B)
      • 但是这样会出问题,比如,max(A++,B++), 这样的操作会执行两次自增操作
  • 取消宏替换

    • #undef name
  • 运算符连接实际参数

    • #define paste(a,b) a##b
      paste(name,1) 相当于name1
  • 条件包含

    • #if !define
      #define name 替换内容
      #elif a == b
      #define …
      #endif

注意

  • 定义的函数未声明返回类型则返回类型为 int
  • 函数的定义和声明必须一致,如果在同一个文件中定义和声明不一致可以检测出来,但是不同文件时检测不出来的。
    C程序设计语言学习第四章:函数与程序结构_第1张图片

你可能感兴趣的:(C语言)