学习记录第十二天

标识符的作用域:

        作用域:标识符可生效的范围

        局部作用域(Local Scope):
              1.定义:局部变量是在函数内部或某个代码块(如if语句或循环语句)中声明的变量。它们的作用域仅限于声明它们的函数或代码块。
              2.生命周期:局部变量的生命周期是短暂的,它们在函数调用开始时被创建,在函数调用结束时被销毁。对于在代码块中声明的变量,其生命周期从变量声明开始到代码块结束时结束。

        全局作用域(Global Scope):
              1.定义:全局变量是在所有函数体之外声明的变量。它们可以在整个程序的任何地方被访问,包括所有的函数和代码块。
              2.生命周期:全局变量的生命周期贯穿整个程序的运行过程,它们在程序开始执行时创建,在程序结束时销毁。

        1.标识符必须先定义在使用;

        2.在同一作用域中不能定义同名标识符;

        3.在不同作用域中定义的同名标识符互不影响;

        4.在两个或两个具有包含关系的不同作用域中定义的同名标识符,外层标识符在内层不可见

变量的生存期:

静态变量的生存期
静态变量在程序启动时分配内存,并保持存在直至程序结束。这意味着静态变量的生命周期是全局的,无论是全局静态变量还是局部静态变量。静态变量的初始化发生在程序启动时,对于未显式初始化的静态变量,它们会被初始化为零。局部静态变量即使在其所在的函数执行完毕后,其值依然保留,以便下次函数调用时可以使用.
动态变量的生存期
动态变量通常是指在程序运行时动态分配内存的变量。这些变量的生命周期仅限于它们被分配和释放的时间段。一旦函数执行结束或者动态内存被释放,变量所占用的内存就不再保留,其生存期随之结束.

部分关键字的作用:

auto关键字用于声明自动变量,即局部变量。不过,在现代C语言编程中,auto关键字的使用并不常见,因为局部变量的默认存储类型就是自动的,所以通常不需要显式地使用auto来声明。

register关键字在C语言中指示编译器尝试将变量存储在CPU的寄存器中,而不是常规的内存。这样做的目的是为了加快对该变量的访问速度,因为寄存器的读写速度远快于内存。

static关键字用于定义变量或函数:
  1.局部静态变量:
      1.当在一个函数内部使用static关键字声明变量时,该变量成为局部静态变量。与普通局部变量不同,局部静态变量在第一次被初始化后,其值在函数调用之间保持不变,即其生存期跨越了函数调用的界限,直到整个程序结束。
      2.局部静态变量的存储空间在数据段中分配,而非在栈上。这意味着在函数调用结束后,局部静态变量不会被释放,其值在下一次函数调用时仍然可用。
  2.全局静态变量:
      1.当在文件或函数外部使用static关键字声明变量时,该变量成为全局静态变量。全局静态变量的生存期是整个程序的生命周期,但其作用域被限制在声明它的文件内,即在其他源文件中不可见,这有助于避免命名冲突。
      2.全局静态变量的初始化发生在程序开始执行之前,未初始化的全局静态变量将被初始化为零。
  3.静态函数:
      static关键字也可以用于函数声明,这样声明的函数称为静态函数。静态函数的作用域被限制在声明它的文件内,即在其他源文件中不可见。这有助于模块化代码,避免函数名称冲突,并限制函数的访问范围,提高代码的安全性和可维护性。

extern关键字在C语言中用于声明变量或函数,表明该变量或函数虽然在当前文件中被声明,但其定义位于其他文件中。这样做的目的是允许在一个文件中定义变量或函数,并在其他文件中通过extern关键字来访问它们,从而实现跨文件的数据共享和函数调用.

预处理命令

 #include 指令
用于在当前文件中包含其他头文件的内容。有两种形式:
  1.#include <filename>:用于包含系统定义的头文件。
  2.#include "filename":用于包含用户自定义的头文件,首先在当前目录下查找,如果找不到则在系统路径中查找。
 #define 指令
用于定义宏,可以是无参宏或带参宏。无参宏是简单的文本替换,而带参宏在替换时会用实际参数替换形式参数。宏定义通常用于创建符号常量或简化复杂的表达式。
 #ifdef, #ifndef, #endif 指令
用于条件编译,根据宏是否被定义来决定是否编译特定的代码段。

宏定义

        1.不带参数的宏,例如:

#define PI 3.14

        2.带参数的宏,例如:

#define S(a,b) ((a) + (b))

        所有的宏都是无脑的文本替换

条件编译

条件编译通常涉及以下几个关键字:
  #if:开始一个条件编译块,后面跟随一个表达式,只有当表达式求值为真(非零)时,对应的代码块才会被编译。
  #ifdef / #ifndef:分别用来检查指定的宏是否已经被定义或未被定义,并据此决定是否编译后续的代码块。
  #else:提供一个备选的代码块,当#if、#ifdef或#ifndef后面的条件为假时,会编译#else后面的代码块。
  #elif:作为#else和另一个#if的结合,用于在多个条件中进行检查。
  #endif:结束一个条件编译块。
条件编译的典型应用场景
  防止头文件多重包含:通过在头文件的开始处使用#ifndef和#define来确保头文件不会被包含多次。

  • 25
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值