读《The C Programming Language》(6)

本文探讨了程序设计中函数和结构的重要性,强调了如何通过合理划分函数提高代码可读性和复用性。文章讨论了函数的正确声明方式、外部变量的作用域及使用场景,并介绍了头文件的概念及其作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第四章主题是函数和程序结构,内容越来越深入了,收获也越来越大。我前面写了一篇“程序应构思到什么地步再开始写”的文章,提到了程序的设计问题。本章4.1小节作者就给出了程序构思的例子。对于一个将输入中包含特定字符串的行打印出来的程序,作者把它分成了三部分:
while (there's another line)
    if (the line contains the pattern)
        print it
而这三部分都可以写成独立的函数。至于为什么,作者说,"Three small pieces are better to deal with than one big one, because irrelevant details can be buried in the functions, and the chance of unwanted interactions is minimized. And the pieces may even be useful in other programs."。不相关的细节被隐藏在独立的函数中,相互影响带来的错误就大大减少了。而且这样的函数可以被别的程序复用。

有一点很容易搞错,返回值类型被省略的函数,默认的返回值类型不是void,而是int,比如main函数。

4.2小节中,作者提到了一个容易被忽略的问题。如果一个函数在一个文件中被定义,而在另一个文件中被调用,就应该在调用函数之前声明函数,否则它会在第一次出现时被隐式声明。这样隐式声明的函数返回值类型为int,对参数不做任何限定。同样,声明时如果括号内不包含任何参数,编译器也对参数不做任何限定,因而不会进行参数检测。因此作者强调如果函数有参数,一定要声明参数,如果没有,就声明为void。

在提到外部变量的适用范围时,作者说,"If a large number of variables must be shared among functions, external variables are more convenient and efficient than long argument lists."函数之间如果有大量需共享的数据,使用外部变量要比参数列表方便。接着作者举了一个逆波兰计算器的例子,其中的栈就用外部变量来实现。

"The scope of an external variable or a function lasts from the point at which it is declared to the end of the file being compiled."外部变量或函数的作用域从它被声明开始,一直到文件的结尾。所以如果使用的外部变量或者函数在另一个文件,一定要通过extern声明。如果在同一个文件,则取决于变量或函数定义的位置。如果定义在使用之前,则定义就充当声明;如果定义在使用之后,就必须显式声明。

关于头文件(header file)的由来,作者在4.5小节给出了解释。由于很多文件都需要声明外部变量或函数,而我们又不希望这样的声明重复,因此我们把这些公用的声明放到一个文件中,就是头文件。在这里会有一些折衷,通常一个文件需要的外部声明并不多而维持好几套头文件又比较麻烦,因此对于一般规模的程序,通常把所有的外部声明放到一个头文件中,而对大规模的程序则可以组织成多个头文件。

static关键字可以被应用在外部变量、外部函数和局部变量上。如果应用在外部变量或函数上,这样的变量或函数就只能在当前文件使用,在别的文件不可见。如果应用在局部变量上,这样的变量将一直存在,不随函数的进入和退出而创建和销毁。

关于register关键字,有意思的两点是:1.你把一个局部变量声明成register的,编译器可以忽略不计;2.只要你声明成了register变量,就一定不能取到它的地址,不管它是不是真的被放到了寄存器里。呵呵,对程序员有点不公平哦。

#include有两种形式,#include "filename"和#include <filename>。二者的差别是前者先从源程序的目录找起,如果找不到就和后者一样,按照一定的规则查找。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值