C结构和风格
这是C编程语言中良好编码风格的基本介绍。它旨在提供有关如何有效使用缩进,注释和其他元素的信息,这些元素将使您的C代码更具可读性。它不是实际C编程的教程。
作为一个初级程序员,在程序代码中创建结构的重点可能并不明确,因为编译器并不关心差异。然而,随着程序变得复杂,编写程序的可能性已成为一项共同努力。(或者其他人可能希望了解它是如何完成的。或者您可能需要在几年后再次阅读它。)编写良好的代码还可以帮助您概述代码的功能。
在接下来的部分中,我们将尝试解释良好的编程实践,从而使您的程序更加清晰。
简介
在C中,程序由语句组成。语句以分号结束,并在称为函数的部分中收集。按照惯例,语句应保持在自己的行中,如下例所示:
#include <stdio.h> int main (void ) { printf (“Hello,World!\ n ” ); 返回 0 ; }
以下代码块基本相同。虽然它包含完全相同的代码,并且将以相同的结果进行编译和执行,但删除间距会产生本质区别,因此更难以阅读。
#include <stdio.h> int main (void ) { printf (“Hello,World!\ n ” ); 返回 0 ;}
简单地使用缩进和换行可以极大地提高代码的可读性,而不会影响代码性能。可读代码使得更容易看到函数和过程的结束位置以及哪些行是循环和过程的一部分。
本课将重点介绍如何改进应用公式并打印结果的示例代码的编码样式。稍后,您将看到如何更详细地编写此类任务的代码。现在,重点关注代码的外观,而不是它的作用。
换行和缩进
在代码中添加空格可以说是良好代码结构中最重要的部分。有效使用空格可以创建代码流的可视化比例,这在您想要维护代码时返回代码时非常重要。
换行
请注意行号的使用。它们不是实际代码的一部分。他们是唯一的参考。 |
使用最少的换行符,代码几乎不可读,并且可能很难调试或理解:
1 #include <stdio.h> 2 int main (void ) { int revenue = 80 ; int cost = 50 ; int roi ; roi = (100 * (收入 - 成本)) / 成本; if (roi > = 0 ) { printf (“%d \ n ” , roi ); } return 0 ; }
不是将所有内容放在一行上,而是分解长行更加可读,以便每个语句和声明都在自己的行上。插入换行符后,代码将如下所示:
1 #include <stdio.h> 2 int main (void ) { 3 int revenue = 80 ; 4 int cost = 50 ; 5 int roi ; 6 roi = (100 * (收入 - 成本)) / 成本; 7 if (roi > = 0 ) { 8 printf (“%d \ n ” , roi ); 9 } 10 返回 0 ; 11 }
空行
应使用空行来抵消代码的主要组件。一直使用它们
- 在预编译器声明之后。
- 声明新变量后。
- 使用您自己的判断来找到应该分离组件的其他位置。
基于这两个规则,现在应该至少添加两个换行符。
- 在第1行之后,因为第1行具有预处理程序指令。
- 在第5行之后,因为第5行包含变量声明。
这将使代码比以前更具可读性:
以下代码行在函数之间有换行符,但没有缩进。
1 #include <stdio.h> 2 3 int main (void ) { 4 5 int revenue = 80 ; 6 int cost = 50 ; 7 8 int roi ; 9 10 roi = (100 * (收入 - 成本)) / 成本; 11 12 if (roi > = 0 ) { 13 printf (“%d \ n“ , roi ); 14 } 15 16 return 0 ; 17 }
但它仍然没有它可读的可读性。
缩进
当您按下回车键/返回键时,许多文本编辑器会自动缩进。
虽然在关键代码块之间添加简单的换行符可以使代码更容易阅读,但它不提供有关程序块结构的信息。使用tab键非常有用。缩进通过将其起点移动到新列来直观地分离执行路径。这种简单的练习将使阅读和理解代码变得更加容易。缩进遵循一个相当简单的规则:
- 新块中的所有代码都应缩进一个选项卡[1],而不是前一个路径中的代码。
根据上一节中的代码,有两个块需要缩进:
- 第4到16行
- 13号线
1 #include <stdio.h> 2 3 int main (void ) { 4 5 int revenue = 80 ; 6 int cost = 50 ; 7 8 int roi ; 9 10 roi = (100 * (收入 - 成本)) / 成本; 11 12 if (roi > = 0 ) { 13 printf (“%d \ n“ , roi ); 14 } 15 16 return 0 ; 17 }
现在很明显,程序的哪些部分适合哪些块。你可以告诉程序员程序的哪些部分是有条件的,哪些是他或她没有的。虽然它可能不会立即引起注意,但是一旦许多嵌套路径被添加到程序结构中,使用缩进可能非常重要。因此,缩进使程序的结构清晰。
据称,研究表明,压缩大小在2到4个字符之间比8个字符缩进更容易阅读[。但是,某些系统仍可能使用8个字符的缩进[。
评论
代码中的注释可用于各种目的。它们提供了最简单的方法来引发代码的特定部分(及其目的); 以及在代码的各个部分之间提供视觉“分割”。在整个代码中获得良好的注释将使您更容易记住代码的哪些特定部分。
现代风格的C(和许多其他语言)中的评论可以有两种形式:
1 //单行注释(由C99标准添加,俗称c ++样式的注释)
和
1 / *多行 2 评论 3 (仅C89标准支持的评论形式)* /
请注意,单行注释是C的最新添加,因此某些编译器可能不支持它们。最新版本的GCC将不会有任何问题支持它们。
本节将重点介绍每种评论形式的各种用途。
单行评论
单行注释对于解释代码某些部分的简单“侧面”注释最有用。放置这些注释的最佳位置是变量声明旁边,以及可能需要解释的代码段旁边。评论应明确相应代码背后的意图和想法。从阅读代码中可以立即看出的不属于评论。
根据我们以前的计划,有很多好的地方可以发表评论
- 第5行和/或第6行,解释’收入’和’int cost’代表什么,
- 第8行,解释变量’roi’将用于什么,
- 第10行,解释计算的想法,
- 第12行,解释’如果’的目的。
这将使我们的程序看起来像
#include <stdio.h> int main (void ) { int income = 80 ; //截至2016年 int cost = 50 ; int roi ; //投资回报百分比 roi = (100 * (收入 - 成本)) / 成本; //来自会计账簿的公式 if (roi > = 0 ) { //我们不关心负roi printf (“%d \ n ” , roi ); } 返回 0 ; }
多行评论
单行注释是一项新功能,因此许多C程序员只使用多行注释。
多行注释对于长代码解释最有用。它们可以用作版权/许可声明,也可以用来解释代码块的用途。这可能有两个原因:它们使您的函数更容易理解,并且可以更容易地发现代码中的错误。如果你知道一个块应该做什么,那么在发生错误时找到负责的代码就容易多了。
作为一个例子,假设我们有一个程序,旨在打印“Hello,World!”一定数量的行,指定的次数。这个程序中有很多for循环。对于这个例子,我们将调用行数i,并将每行的字符串数称为j。
描述’for’循环i目的的多行注释的一个很好的例子是:
/ * For Loop(int i) 循环以下过程i次(对于行数)。在每个循环上执行'for'循环j, 并 在每个循环结束时打印一个新行。* /
这提供了一个很好的解释我的目的是什么,而不是详细了解j的作用。通过详细了解特定路径的作用(而不是其中的路径),可以更轻松地对路径进行故障排除。
类似地,您应该始终在每个函数之前包含多行注释,以解释每个函数的角色,前置条件和后置条件。始终将技术细节留给程序中的各个块 – 这样可以更容易地进行故障排除。
函数描述符应该类似于:
/ * Function:int hworld(int i,int j) 输入:int i(行数),int j(每行的实例数) 输出:0(成功时) 过程:打印“Hello,World!” j次,以及i行标准输出的新行。 * /
该系统允许一目了然地解释功能应该做什么。然后,您可以详细了解程序的各个方面如何在程序中实现。
最后,如果您希望拥有美观的源代码,多行注释系统可以轻松添加注释框。这些评论比其他情况下的评论更突出。它们看起来像这样。
/ *************************************** *这是多行评论 *即是几乎被一个 *酷,星空边界 包围! ************ /
应用于我们的原始程序,我们现在可以包含更具描述性和可读性的源代码:
#include <stdio.h> int main (void ){ / ******************************************* ***************************************** *功能:int main(无效) *输入:无 *输出:成功时返回0 *过程:如果不是负数,则以2016为单位打印2016年投资回报率。 ************************************************** ********************************** / int revenue = 80 ; //截至2016年 int cost = 50 ; int roi ; //投资回报百分比 roi = (100 * (收入 - 成本)) / 成本; //来自会计账簿的公式 if (roi > = 0 ) { //我们不关心负roi printf (“%d \ n ” , roi ); } 返回 0 ; }
这将允许程序的任何外部用户轻松地理解代码功能是什么以及它们如何操作。它还抑制了其他同名函数的不确定性。
一些程序员在块注释的右侧添加一列星标:
/ *************************************** *这是多行评论* *完全被* *凉爽的星空边界所 包围!* *************************************** /
但是大多数程序员都没有在块注释的右侧放置任何星标。他们认为调整右侧是浪费时间。
用源文件编写的注释可用于通过使用Doxygen等常用工具自动记录源代码。
猜你想读:《C编程.开始C》5.变量