自学编程,从此开始

上第2学堂,听有趣的编程课

课文: 《代码注释与代码排版》 (点击查看完整内容:视频+评测+讨论+……)

作者:null

好代码,从注释和排版开始!

课文题图

 

第2节:代码注释和代码排版

注释

注释是写给阅读代码的人看的,用来帮助阅读者理解代码。代码的作者基本就是代码的第一个阅读者,所以注释也是写给写代码的人自己看的。

C++有两个注释方式:行注释和块注释。

更深写代码,多数会使用行注释。注释并不是写得越长越好!对具体代码的注释,多数情况下一行注释就要切中要害。注意理解这句话,视频里没有的:“注释和代码共同完成表达代码的含义”,而不是让注释和代码各说各的,或者让注释包揽一切说明。很多时候,甚至不需要一行注释,而只需要半行或更少的注释,这时常用的方法是把注释写在某一行代码之后。本课视频以及后面课程的视频,都有大量如何使用行注释的演示。

当然,大块的注释仍然会存在,通常是用来在代码对一段复杂的自定义算法在实现之前,先说明其整体思路。这中间为什么强调是“自定义算法”呢,因为如果你用的是标准算法,那通常:一、有现成的实现,因此大段不了;二、标准算法你懂别人也懂,这时注释更多用来说明:我为什么要使用这个算

块注释还有一个强项:夹在代码中间。本课视频以及后面课程的视频,偶尔也会有这类用法的演示。

语句

C++中的许多代码行并不能称为“语句”;语法律师很喜欢严格区分每一行代码什么是语句,什么不是。但我们不建议在这里头纠结太久。代码中的语句就像我们说话的“句子”,多数就是用来表示一个相对完整的表述。C++中使用分号来作为语句的结束,更主要的是为了方便灵活排版——事实上很多后来的语言,包括Python或更后面的 Golang,就回到以自然换行或换段(多个换行)作为结束的方法。至于纠结为什么“包含头文件”这行代码不算是一行语句,就更没意义了。因此,课程中我们只做这样的解释:有些代码行就是天生要以换行作为结束的。

第一种情况是:这类代码注定就是“短短”的,考虑它需要换行的情况纯属过度设计,比如:刚说的“包含头文件”的代码:

#include <iostream>

其中可变部分就是“iostream”,而它是一个文件名,文件名理论是最大长度好像是250个字符(不精准)?但真要有人搞出这么长的一个文件名,我们第一反应是过去揍他,而不是想着如何换行。既然天生一行内就结束,那何必再加个分号来表示结束呢。

第二种情况是:语法结构安排上,就是希望你一行内就写完,此时写分号结束不仅多余,而且奇怪。比如前面说的“行注释”。理论上,块注释完全可以代替行注释,但为了方便你鼓励你快速地写注释,才有了行注释。事实上块语句也不使用分号表示结束,人家使用“/ /”来界定注释的范围。另外一个例子,就是视频中提到的“复合语句”,其实也被称为“块语句”,它使用“{ }”来界定所包含的内容。

续行符

在使用C语言(而不是C++)编程时,续行符用处比较大——并不是说使用C语言的程序员更喜欢把代码刻意排版得一团糟糕——虽然著名的IOCCC大赛(世界C语言混乱大赛 ),确实也就C语言圈子存在这种文化……我的意思是,C语言编程非常依赖“宏”,而宏的定义也是默认在“行内结束”——这或许说明C语言的发明者们心底并不期望大家定义长长的宏——但事实上由于C语言的语言特性极少(所以号称学起来超简单,这确实没错,它只是用起来超耗智商——于是最终宏就被用歪了,歪到简直可以粗过主干——这种事大家都会有啦,像C++模板编程,也是歪到曾经连C++之父都倒吸一口气……

我在说什么?

总之就是,当使用C++编程,除了在宏里面,我们要少用续行符这个家伙。至于宏,那有另外一知规定是这样的:当使用C++编程,应当少用宏。

排版

好的代码排版和好的代码注释一样重要。写代码一定注意:不要为了短而短,不要为了短而在排版上动歪脑子。

白话C++推荐以下排版方法,会在实际遇上提出。今天就讲两个:

复合语句或块语句,总是将左右花括号都各占一行。比如:

//推荐:
int main()
{

}

而——

//不推荐
int main() {

}

你若问我为什么?似乎也没为什么,其实在使用其它语言,比如Java时我也使用后者。

使用在缩进时,仍然使用键盘上的“Tab”键,但是记得照《准备篇》有关Qt Creator的相关课程所说,将其设置成自动转换为四个空格。