为什么K&R2使用这么多全局变量?

时间:2018-06-22 02:14:27

标签: c

我的老师告诉我两件事:

  1. 尽可能避免使用全局变量。
  2. K&R2(C编程语言)对于C程序员来说是一本好书。

但是当我开始阅读K&R2时,我发现这本书几乎充满了全局变量。为什么这本书对C程序员来说是一本书?而且,如果全局变量确实对C程序的可读性和维护有害,那么当著名的教科书使用它太多时,我该如何掌握更好的做法呢?

1 个答案:

答案 0 :(得分:4)

这是我快速浏览K&R“ The C Programming Language,第二版”的结果。

第1章“教程简介”:

  • 1.1“ Hello world”-0个全局变量
  • 1.2“华氏度” — 0个全球变量
  • 1.3“ For循环”-0个全局变量
  • 1.4“符号常量”-0个全局变量
  • 1.5“字符,行,单词计数” — 0个全局变量
  • 1.6“数组”-0个全局变量
  • 1.7“功能” — 0个全局变量
  • 1.8个“参数” — 0个全局变量
  • 1.9“字符数组”-0个全局变量
  • 1.10“外部变量和范围”-§1.9的代码改编版中的3个全局变量,其中等效函数不使用全局变量

第2章-类型,运算符和表达式

  • 2.1-2.12 — 1个明确的全局变量,以及可以是局部或全局的数字。

第3章-控制流

  • 3.1—3.8 — 0个全局变量

第4章-功能和程序结构

  • 4.1“功能基础” — 1个全局变量
  • 4.2“函数返回非整数” — 0个全局变量
  • 4.3“外部变量”-4个全局变量
  • 4.4“范围规则” — 1对全局变量,重复了几次(从4.3开始重复)
  • 4.5“头文件” — 0个全局变量
  • 4.6“静态变量” — 2个文件范围static变量(再次从4.3重复)。
  • 4.7“寄存器变量”-0个全局变量
  • 4.8“块结构” — 2个全局变量(以使局部变量隐藏全局变量)
  • 4.9“初始化”-绝对为0; 5个可以是全球或本地
  • 4.10“递归” — 0个全局变量
  • 4.11“预处理器”-0个全局变量

第5章-指针和数组

  • 5.1“指针和地址”-绝对为0; 3个可以是全局或本地
  • 5.2“指针和参数” — 0个全局变量
  • 5.3“指针和数组” —绝对为0; 2个可以是全局或本地
  • 5.4“地址算术” — 2个文件范围static
  • 5.5“字符指针和函数” — 0绝对是全局的; 2个可以是全局或本地
  • 5.6“指针数组和指向指针的指针”-1个全局
  • 5.7“多维数组”-1个全局
  • 5.8“初始化”-0个全局变量
  • 5.9“指针与多维数组” —绝对为0; 4个可以是全局或本地
  • 5.10“命令行参数”-0个全局变量
  • 5.11“函数指针” — 1个全局变量
  • 5.12“复杂的声明” — 5个全局变量

第6章-结构

  • 6.1“结构基础” — 0绝对是全局的;有些可能是全球性或本地性
  • 6.2“结构和功能” — 0绝对是全局的;有些可能是全球性或本地性
  • 6.3“结构数组”-1个全局值; 2个可以是全局或本地
  • 6.4“结构的指针”-0个全局变量
  • 6.5“自指代结构”-0个全局变量
  • 6.6“表查找”-1个全局
  • 6.7“ Typedef” — 0绝对是全局的;有些可能是全球性或本地性
  • 6.8“联盟” — 0绝对是全局的; 1个可以是全局或本地
  • 6.9“位域”-0个全局变量

第7章-输入和输出

  • 7.1“标准输入和输出”-0个全局变量
  • 7.2“格式化输出-printf” — 0个全局变量
  • 7.3“可变长参数列表” — 0个全局变量
  • 7.4“格式化输入-scanf” — 0绝对是全局值;有些可能是全球性或本地性
  • 7.5“文件访问” — 0个全局变量
  • 7.6“错误处理-stderr和exit” — 0个全局变量
  • 7.7“行输入和输出”-0个全局变量
  • 7.8“其他功能” — 0个全局变量; 1个可以是全局或本地

第8章-Unix系统界面

  • 8.1“文件描述符”-0个全局变量
  • 8.2“低级I / O —读写” — 0个全局变量(3个函数静态变量)
  • 8.3“打开,创建,关闭,取消链接” — 0绝对是全局的; 1可能是全球性的,但可能不是全球性的
  • 8.4“随机访问” — 0个全局变量
  • 8.5“ fopen和getc的示例实现” — 1个全局变量
  • 8.6“列出目录” — 0个全局变量
  • 8.7“存储分配器” — 2个全局变量

在我看来,这并不是很多全球性问题。实际上,大多数“可能是全局变量或局部变量”都是局部变量,但是上下文还不够大,无法确定。在几乎所有有全局变量的情况下,都有充分的理由使用这些特定的全局变量,尽管毫无疑问,还有其他设计可以避免大多数全局变量。