程序结构

学习编程语言最好的方式可能是编写一个程序。因此,这里是我们的第一个程序。

// my first program in C++

#include <iostream>
using namespace std;

int main ()
{
  cout << "Hello World!";
  return 0;
}
Hello World!

第一个面板(浅蓝色)显示了我们第一个程序的源代码。第二个面板(浅灰色)显示了程序编译和执行后的结果。在左边,灰色的数字代表行号 - 这些不是程序的一部分,只是为了提供信息。

编辑和编译程序的方式取决于你使用的编译器。取决于它是否有开发界面以及它的版本。如果你对如何编译 C++ 控制台程序有疑问,请查阅编译器章节以及编译器附带的手册或帮助。

之前的程序是编程初学者第一次编写的典型程序,它的结果是在屏幕上打印 "Hello World!" 句子。它是可以用 C++ 编写的最简单的程序之一,但它已经包含了每个 C++ 程序都具有的基本组成部分。我们将逐行查看我们刚刚编写的代码。

// 这是我的第一个 C++ 程序
这是一条注释行。所有以两个斜杠符号 (//) 开头的行都被认为是注释,并且对程序的行为没有任何影响。程序员可以使用它们在源代码中包含简短的解释或说明。在本例中,该行是对我们程序的简要描述。
#include <iostream>
以井号 (#) 开头的行是预处理指令。它们不是带有表达式的常规代码行,而是编译器预处理器的指示。在本例中,指令 #include <iostream> 告诉预处理器包含 iostream 标准文件。这个特定的文件 (iostream) 包含了 C++ 中基本标准输入输出库的声明,包含它是因为稍后将在程序中使用它的功能。
using namespace std;
标准 C++ 库的所有元素都在一个叫做命名空间的东西中声明,这个命名空间的名字是 std。所以为了访问它的功能,我们用这个表达式声明我们将使用这些实体。这一行在使用标准库的 C++ 程序中非常常见,事实上,它将被包含在这些教程中包含的大多数源代码中。
int main ()
这一行对应于 main 函数定义的开始。无论它在源代码中的位置如何,main 函数都是所有 C++ 程序开始执行的地方。不管之前或之后是否定义了其他带有其他名称的函数 - 包含在这个函数定义中的指令将永远是 C++ 程序中首先执行的指令。出于同样的原因,所有 C++ 程序都必须有一个 main 函数。

代码中 main 这个词后面跟着一对圆括号 (())。那是因为它是一个函数声明:在 C++ 中,将函数声明与其他类型的表达式区分开来的是这些跟随在其名称之后的括号。可选地,这些括号可能包含一个参数列表。

在这些括号之后,我们可以找到 main 函数的主体,用大括号 ({}) 括起来。包含在这些大括号中的内容是函数执行时的行为。
cout << "Hello World!";
这一行是一个 C++ 语句。语句是一个可以实际产生某种效果的简单或复合表达式。事实上,这个语句执行了我们第一个程序中产生可见效果的唯一动作。

cout 是 C++ 中标准输出流的名称,整个语句的含义是将一个字符序列(在本例中是 Hello World 字符序列)插入到标准输出流(cout,通常对应于屏幕)中。

coutstd 命名空间中的 iostream 标准文件中声明,所以这就是为什么我们需要包含这个特定文件,并声明我们将在代码中稍后使用这个特定的命名空间。

请注意,该语句以分号字符 (;) 结尾。这个字符用于标记语句的结束,事实上,它必须包含在所有 C++ 程序中所有表达式语句的末尾(最常见的语法错误之一确实是忘记在语句后包含分号)。
return 0;
return 语句导致 main 函数结束。 return 后面可以跟一个返回码(在我们的例子中,后面跟一个值为零的返回码)。main 函数的返回码 0 通常被解释为程序运行正常,在执行过程中没有出现任何错误。这是结束 C++ 控制台程序最常用的方式。

您可能已经注意到,并非该程序的所有行在执行代码时都会执行操作。有一些行只包含注释(那些以 // 开头的)。有一些行带有编译器的预处理器指令(那些以 # 开头的)。然后有一些行开始声明一个函数(在本例中是 main 函数),最后是一些带有语句的行(比如插入到 cout 中),这些行都包含在 main 函数的大括号 ({}) 分隔的块中。

该程序已被结构化为不同的行,以便更具可读性,但在 C++ 中,我们没有关于如何在不同行中分隔指令的严格规则。例如,代替

1
2
3
4
5
int main ()
{
  cout << " Hello World!";
  return 0;
}

我们可以写

1
int main () { cout << "Hello World!"; return 0; }

全部在一行中,这与之前的代码具有完全相同的含义。

在 C++ 中,语句之间的分隔是通过在每个语句末尾加上分号 (;) 来指定的,因此,不同代码行中的分隔对于这个目的来说根本不重要。我们可以每行编写多个语句,或者编写一个占用多行代码的单个语句。在不同的行中划分代码只是为了使其对于可能阅读它的人来说更易读和示意性。

让我们向我们的第一个程序添加一个额外的指令

// my second program in C++

#include <iostream>

using namespace std;

int main ()
{
  cout << "Hello World! ";
  cout << "I'm a C++ program";
  return 0;
}
Hello World! I'm a C++ program

在这种情况下,我们在两个不同的语句中对 cout 执行了两次插入。再次,在不同的代码行中进行分隔只是为了使程序更具可读性,因为 main 完全可以这样定义

1
int main () { cout << " Hello World! "; cout << " I'm a C++ program "; return 0; }

如果我们认为更方便,我们也可以自由地将代码分成更多行

1
2
3
4
5
6
7
8
int main ()
{
  cout <<
    "Hello World!";
  cout
    << "I'm a C++ program";
  return 0;
}

结果将与之前的示例完全相同。

预处理器指令(那些以 # 开头的)不在此一般规则之内,因为它们不是语句。它们是由预处理器读取和处理的行,并且本身不会生成任何代码。预处理器指令必须在自己的行中指定,并且不必以分号 (;) 结尾。

注释


注释是源代码中被编译器忽略的部分。它们什么也不做。它们的目的是只允许程序员在源代码中嵌入注释或描述。

C++ 支持两种插入注释的方式

1
2
// line comment
/* block comment */

其中第一个,被称为行注释,丢弃从找到斜杠对 (//) 的位置到同一行末尾的所有内容。第二个,被称为块注释,丢弃 /* 字符和第一次出现 */ 字符之间的所有内容,并且可以包含多行。
我们将向我们的第二个程序添加注释

/* my second program in C++
   with more comments */

#include <iostream>
using namespace std;

int main ()
{
  cout << "Hello World! ";     // prints Hello World!
  cout << "I'm a C++ program"; // prints I'm a C++ program
  return 0;
}
Hello World! I'm a C++ program

如果在程序的源代码中包含注释而不使用注释字符组合 ///**/,编译器将把它们当作 C++ 表达式,很可能会在编译时导致一个或多个错误消息。
Index
目录