1.3 注释简介
在程序变得更复杂之前,我们应该了解一下C++是如何处理注释(comments)的。注释可以帮助人类读者理解程序。注释通常用于概述算法,确定变量的用途,或者解释复杂难懂的代码段。编译器会忽略注释,所以注释对程序的行为或性能不会有任何影响。
虽然编译器会忽略注释,但读者并不会。即使系统文档的其他部分已经过时,程序员也倾向于相信注释的内容是正确可信的。因此,错误的注释比完全没有注释更糟糕,因为它会误导读者。所以,当你修改代码时,不要忘记同时更新注释!
C++中注释的种类
C++中有两种注释:单行注释和界定符对注释。单行注释以双斜线(//)开始,以换行符结束。当前行双斜线右侧的所有内容都会被编译器忽略,这种注释可以包含任何文本,包括额外的双斜线。
另一种注释使用继承自C语言的两个界定符。这种注释以一个斜线加星号开始,以它反过来的样子结束,可以包含除*/外的任何内容,包括换行符。编译器将落在这之间的所有内容都当做注释。
注释界定符可以放置于任何允许放置制表符、空格符或换行符的地方。注释界定符可以跨越程序中的多行,但这并不是必须的。当注释界定符跨越多行是,最好能显式指出其内部的程序行都属于多行注释的一部分。我所采用的风格是,注释内的每行都以一个星号开头,从而指出整个范围都是多行注释的一部分。
程序中通常同时包含两种形式的注释。注释界定符对通常用于多行解释,而双斜线注释常用于半行和单行附注。
#include<iostream>
/*
* 简单主函数:
* 读取两个数,求它们的和
*/
int main(){
// 提示用户输入两个数
std::cout<<"Enter two numbers:"<<std::endl;
int v1=0,v2=0; // 保存我们读入的输入数据的变量
std::cin>>v1>>v2; // 读取输入数据
std::cout<<"The sum of "<<v1<<" and "
<<v2<<" is "<<v1+v2<<std::endl;
return 0;
}
在实际程序中,注释文本的显示形式是否区别于程序代码文本的显示,依赖于你所使用的程序设计环境是否提供这一特性。
注释界定符不能嵌套
界定符对形式的注释是以/*
开始,以*/
结束的。因此,一个注释不能嵌套在另一个注释之内。编译器对这类问题所给出的错误信息可能是难以理解、令人迷惑的。例如,在你的系统中编译下面的程序,就会产生错误:
/*
* 注释对/* (*//*)不能嵌套。
* 不能嵌套几个字会被认为是源码,
* 像剩余程序一样处理。
*/
int main(){
return 0;
}
我们通常需要在调试期间注释掉一些代码。由于这些代码可能包含界定符对形式的注释,因此可能导致注释嵌套错误,因此最好的方式是用单行注释方式注释掉代码段的每一行。
// /*
// * 单行注释中的任何内容都会被忽略
// * 包括嵌套的注释对也一样会被忽略
// */
1.3节练习
练习1.7:编译一个包含不正确的嵌套注释的程序,观察编译器返回的错误信息。
练习1.8:指出下列哪些输出语句是合法的(如果有的话):
std::cout<<"/*";
std::cout<<"*/";
std::cout<</* "*/" */;
std::cout<</* "*/" /* "/*" */;
预测编译这些语句会产生什么样的结果,实际编译这些语句来验证你的答案(编写一个小程序,每次将上述一条语句作为其主体),改正每个编译错误。