《C语言编程初学者指南》一2.7 使用编程惯例和风格

简介: 本节书摘来自华章出版社《C语言编程初学者指南》一书中的第2章,第2.7节,作者【美】Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看 2.7 使用编程惯例和风格 你的程序就是你本人的一种反射,并且,源代码应该显示出一种流畅且一致的风格,从而引导阅读者查看整个算法和程序流程。

本节书摘来自异步社区《C语言编程初学者指南》一书中的第2章,第2.7节,作者【美】Keith Davenport(达文波特) , M1ichael Vine(维恩),更多章节内容可以访问云栖社区“异步社区”公众号查看

2.7 使用编程惯例和风格

你的程序就是你本人的一种反射,并且,源代码应该显示出一种流畅且一致的风格,从而引导阅读者查看整个算法和程序流程。就像是提供交通功能的桥梁一样,风格可以让结构工程师和游客都感受到其美学价值。

你应该坚持一种让自己和其他人能够很容易地阅读代码的风格和惯例。一旦你选择了一种编程风格并且习惯了它,重要的是要保持一致性。换句话说,要坚持它,在同一个程序之中,不要为变量交叉使用命名惯例或者混合使用缩进风格。

在学习如何编程的时候,你至少应该专门考虑两个领域,以开发出一种一致的编程惯例和风格:

空白;
变量命名惯例。

2.7.1 使用空白

在程序设计的圈子里,并不经常讨论空白,因为它并不提供计算上的好处。实际上,编译器会忽略空白,因此,你可以按照自己的意愿来处理它。到底什么是空白呢?打个比方,空白就是你编程的画布。使用不当,它会耗费代码阅读者的眼力;使用得当,它能够变成程序的优点。举几个如何控制空白的几个例子,它们和使用花括号和缩进有关。

缩进是必不可少的,它引导你的视线进入或跳出程序控制。例如,看一下如下这个示例的main()函数,视线会很快告诉你,函数中的代码从逻辑上就属于该函数:

int main()
{
    //your code in here
}

关于缩进,经常遇到的一个问题就是制表符和空格之间的争论。这个争论最终以支持空格而很容易地得到了解决。支持空格的背后理论是因为,实际上制表符可以设置为占据不同的列数。当另外一位程序员打开你的代码的时候,他可能给自己的制表符设置了不同的列数,最终,这会导致格式不一致。

对于程序员初学者来说,另一个常见的问题是缩进多远。我喜欢2个到4个空格的缩进。4个空格以上的缩进,最终可能会导致一行代码太长了。这里的目标是保持一致的缩进风格,从而使得代码能够在计算机屏幕上对齐。

关于空格,还有一件事情需要考虑,这就是花括号的风格,这和缩进的风格密切相关。就像缩进一样,也有多种不同的花括号风格,尽管你很可能会喜欢如下这种:

int main()
{
//your code in here
}

又或者是另外一种:

int main(){
    //your code in here
}

和任何的风格一样,选择权在你的手里,但是,我建议综合考虑,选择一种你所习惯的并且能够和团队的其他人所使用的风格一致的风格。在本书中,我针对每个级别的缩进使用4个空格。

2.7.2 变量命名惯例

如下列出了在声明和命名变量的时候至少应该遵守的规则:

用一个前缀标识数据类型;
使用合适的大写字母或小写字母;
给变量一个有意义的名字。
针对变量名采用一种命名法,这并没有一种对的方法,尽管有的方法比另一些方法要好。在确定你的命名标准之后,最重要的过程就是,在每一个程序中都要保持一致的做法。

在后面的几个小节中,我将向你介绍几种不同的方法,对我和很多其他采用了上述的规则的程序员来说,这些方法都很有效。

陷阱
 

除了遵从一致的变量命名惯例,还要注意,不要在变量名中使用保留字符。作为一条一般性的规则,请遵从如下的建议:

总是以一个小写字母开始变量名;
在变量名中不要使用空格;
在变量名中,只使用字母、数字和下划线(-);
确保变量名少于31个字母,以遵从ANSI C标准。

2.7.3 用前缀表示数据类型

在使用变量的时候,我倾向于选择3种类型的前缀之一,如下所示:

int intOperand1;
float fltResult;
char chrMiddleInitial;

对于每种变量数据类型,我都选择一个单字符的前缀,i(integer的缩写)、f(float的缩写)或者c(character的缩写)。当我在自己的程序代码中看到如下这3个变量的时候,我立刻知道它们的数据类型是什么:

int iOperand1;
float fResult;
char cMiddleInitial;

即便这些变量并没有表露出它们的数据类型,当试图判断变量的内容类型的时候,你还是可以很容易地从前缀中看出来。此外,当和相应的大写和小写字母组合使用的时候,这些单字符的前缀工作得很好,下一小节将会介绍这一点。

2.7.4 正确地使用大写字母和小写字母

变量中的每个单词的第一个字母大写(如下面的代码所示),这是最常用也是最受欢迎的变量命名惯例:

float fNetSalary;
char cMenuSelection;
int iBikeInventoryTotal;

在每个单词中使用大写字母,这使得更容易阅读变量名并识别其作用。现在来看一下相同名称的变量,只不过这一次没有使用大写字母:

float fnetsalary;
char cmenuselection;
int ibikeinventorytotal;

哪种变量名称更容易阅读呢?

除了使用大写字母增加可读性,一些程序员喜欢使用下划线字符来分隔单词,如下所示:

float f_Net_Salary;
char c_Menu_Selection;
int i_Bike_Inventory_Total;

使用下划线字符肯定会使得变量名更加可读,但是,我感觉这有点难看。

常量数据类型为创建标准命名惯例提出了另一个挑战。我喜欢如下的命名惯例:

const int constWeeks = 52;
const int WEEKS = 52;

在第1个常量声明中,我使用了const前缀表明constWeeks是一个常量。然而,注意,我还在常量名中将首字母大写以保持可读性。

在第2个声明中,我直接将常量名中的每一个字母都大写了。这种命名风格真的很突出。

2.7.5 给变量一个有意义的名称

给变量一个有意义的名称,这可能是变量命名惯例中最重要的原则。坚持这么做,可以编写出自文档化的代码。考虑如下的代码,它使用注释来描述变量的作用:

int x; //x is the Age
int y; //y is the Distance 
int z; //z is the Result

上面的变量声明并没有使用有意义的名称,因此,它需要某种形式的文档(如注释)来使得代码的作用更加易于理解。相反,看一下如下的自文档化的变量名称:

int iAge;
int iDistance;
int iResult;

2.7.6 使用scanf()函数

到目前为止,我们已经学习了如何使用printf()函数将输出发送到计算机的屏幕。在本节中,我们将学习如何使用scanf()函数从用户那里接受输入。

scanf()是标准输入输出库所提供的另一个内建函数,它从键盘读取标准输入,并且将其存储到之前声明的变量中。它接受两个参数:

scanf("_conversion specifier_", _variable_);

转换修饰符参数告诉scanf()如何转化输入的数据。可以使用和表2.3给出的相同的转换修饰符。表2.4再次给出和scanf()函数相关的转换修饰符。


73750d24cf571bf70db2fadbb91544379c74032a

如下的代码给出了一个完整的C程序,这是一个加法器(Adder)程序,它使用scanf()函数读入两个整数并且将它们相加。其输出如图2.3所示。

#include <stdio.h>

int main()
{
    int iOperand1 = 0;
    int iOperand2 = 0;
    printf("\n\tAdder Program, by Keith Davenport\n");
    printf("\nEnter first operand: ");
    scanf("%d", &iOperand1); 
    printf("Enter second operand: "); 
    scanf("%d", &iOperand2);
    printf("The result is %d\n", iOperand1 + iOperand2);
    return 0;
}


b46c6696689d97aaadece1bf1fd2ccf1ce0bff43

图2.3 使用scanf()接受来自用户的输入

第1个printf()函数调用,提示用户输入一个数字:

printf("\nEnter first operand: ");

你可能注意到了,上面的printf()函数既没有在末尾包含一个变量,也没有在语句的末尾包含一个转义序列n。当在printf语句的末尾漏掉换行转义序列的时候,程序控制会在适当的位置暂停,等待用户输入。

下面这行代码使用scanf()函数接受来自用户的输入:

scanf("%d", &iOperand1);

scanf()的第1个参数是一个整数转换修饰符("%d"),它告诉程序将输入值转换为一个整数。第2个运算符是一个取址运算符(&),后面跟着变量的名称。

实际上,这个取址运算符包含了一个指针,指向了变量在内存中的位置。我们将在第7章学习关于取址运算符(&)的更多知识,当然也会讨论指针。现在,你只需要知道在使用scanf()函数的时候,必须在取址运算符之后加上一个变量名。

陷阱
 

在一个scanf()函数中,忘记在变量前放置取址运算符(&)并不总是会产生编译器错误,但是,在程序执行的过程中,这总是会导致内存访问的问题。
在从用户那里接收到两个数字(运算数)之后,可以使用一条打印语句来显示如下的结果。

printf("The result is  %d\n", iOperand1 + iOperand2);

在这条打印语句中,我包含了一个单个的转换修饰符(%d),它告诉程序显示一个单个的整数值。在printf()函数的第2个参数中,我使用加号(+)把用户输入的两个数字加了起来。

相关文章
|
1月前
|
监控 网络协议 API
C语言系统编程
C语言系统编程
|
1月前
|
Linux C语言 开发者
Linux系统下C语言的高阶编程
Linux系统下C语言的高阶编程
15 0
|
1月前
|
存储 C语言 索引
掌握多维数组,让你的C语言编程技能暴涨!
掌握多维数组,让你的C语言编程技能暴涨!
|
1月前
|
存储 编译器 程序员
汽车电子行业的 C 语言编程标准
汽车电子行业的 C 语言编程标准
55 0
汽车电子行业的 C 语言编程标准
|
1月前
|
存储 人工智能 安全
C语言:选择+编程(每日一练Day15)
C语言:选择+编程(每日一练Day15)
51 2
|
1月前
|
C语言
C语言:选择+编程(每日一练Day13)
C语言:选择+编程(每日一练Day13)
33 0
|
2天前
|
C语言
C 语言解 常见编程题(下)
C 语言解 常见编程题
36 0
|
22天前
|
Linux 测试技术 C语言
【Linux】应用编程之C语言文件操作
【Linux】应用编程之C语言文件操作
|
1月前
|
自然语言处理 算法 搜索推荐
C语言的编程
C语言的编程
9 1
|
1月前
|
存储 C语言 索引
遍历一维数组C语言,掌握这个技能,你的编程能力直线上升!
遍历一维数组C语言,掌握这个技能,你的编程能力直线上升!