学习编程语言的最好方法是编写程序。通常,初学者编写的第一个程序是一个名为“Hello World”的程序,它只是将“Hello World”打印到您的计算机屏幕上。尽管它非常简单,但它包含了 C++ 程序具有的所有基本组件:

// my first program in C++
#include

int main()
{
std::cout << "Hello World!";
}

上面显示了该程序的 C++ 代码。


Hello World!


上面显示了程序由计算机执行时的结果。面板左侧的灰色数字是行号,使讨论程序和研究错误更容易。他们不是该程序的一部分。


让我们一行一行地检查这个程序:


第 1 行: ​​// my first program in C++​​两个斜杠表示该行的其余部分是程序员插入的注释,但对程序的行为没有影响。程序员使用它们来包括关于代码或程序的简短解释或观察。在这种情况下,它是程序的简要介绍性描述。


第 2 行: ​​#include ​​以井号 ( ​​#​​)开头的行是由所谓的预处理器读取和解释的指令。它们是在程序本身开始编译之前解释的特殊行。在这种情况下,指令​​#include ​指示预处理器包含一段标准 C++ 代码,称为标头 iostream,它允许执行标准输入和输出操作,例如写入该程序的输出(你好,世界) 到屏幕。


第 3 行:空行。空行对程序没有影响。它们只是提高了代码的可读性。

第 4 行: ​​int main ()​​​这一行启动了一个函数的声明。本质上,一个函数是一组被赋予名称的代码语句:在这种情况下,这将名称赋予后面的代码语句组“main”。函数将在后面的章节中详细讨论,但本质上,它们的定义是通过一系列类型 ( ​​int​​​)、名称 ( ​​main​​​) 和一对括号 ( ​​()​​)引入的,可选地包括参数。


命名​​main​​​的函数是所有 C++ 程序中的一个特殊函数;它是程序运行时调用的函数。所有 C++ 程序的执行都从​​main​​函数开始,而不管函数在代码中的实际位置。

第 5 行和第 7 行:​​{​​​和​​}​​​第​​{​​​5 行的左大括号 ( ) 表示​​main​​​函数定义的开始,第​​}​​​7 行的右大括号 ( ) 表示其结束。这些大括号之间的一切都是函数体,它定义了​​main​​调用时会发生什么。所有函数都使用大括号来表示其定义的开始和结束。


第 6 行: ​​std::cout << "Hello World!";​​这一行是一个 C++ 语句。语句是一种可以实际产生某种效果的表达式。它是程序的核心,指定其实际行为。语句的执行顺序与它们出现在函数体内的顺序相同。


该语句有三个部分:一是​​std::cout​​,它标识标准输出设备(通常,这是计算机屏幕)。其次,插入运算符 ( ​​<<​​​),表示后面的内容被插入到 中​​std::cout​​。最后,引号内的句子(“Hello world!”)是插入到标准输出中的内容。


请注意,该语句以分号 (​​;​​)。这个字符标志着语句的结束,就像句号结束句子一样。所有 C++ 语句都必须以分号字符结尾。C++ 中最常见的语法错误之一是忘记以分号结束语句。


您可能已经注意到,在执行代码时,并非该程序的所有行都执行操作。有一行包含注释(以 开头​​//​​​)。有一行带有预处理器的指令(以 开头​​#​​​)。有一行定义了一个函数(在本例中为​​main​​​函数)。最后,一行包含以分号结尾的语句(插入到​​cout​​​),它位于由函数的大括号 ( ​​{ }​​​)分隔的块内​​main​​。


该程序已按不同的行构建并适当缩进,以便阅读它的人更容易理解。但是 C++ 对缩进或如何在不同行中拆分指令没有严格的规则。例如,代替

int main ()
{
std::cout << " Hello World!";
}

我们可以这样写:

int main () { std::cout << "Hello World!"; }


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


在 C++ 中,语句之间的分隔是用结束分号 ( ​​;​​)指定的,因此分隔成不同的行根本无关紧要。许多语句可以写在一行中,或者每个语句都可以多带带一行。代码在不同行中的划分只是为了让可能阅读它的人更易读和更具示意图,但对程序的实际行为没有影响。


现在,让我们在我们的第一个程序中添加一条额外的语句:

// my second program in C++
#include

int main ()
{
std::cout << "Hello World! ";
std::cout << "Im a C++ program";
}


在这种情况下,程序​​std::cout​​​在两个不同的语句中执行了两次插入。再一次,不同代码行的分离只是为程序提供了更大的可读性,因为​​main​​以这种方式定义完全有效:

int main () { std::cout << " Hello World! "; std::cout << " Im a C++ program "; }


源代码也可以分成更多的代码行:

int main ()
{
std::cout <<
"Hello World!";
std::cout
<< "Im a C++ program";
}

结果将再次与前面的示例完全相同。


预处理器指令(那些以 开头的指令​​#​​​)不属于这个一般规则,因为它们不是语句。它们是在正确编译开始之前由预处理器读取和处理的行。预处理器指令必须在它们自己的行中指定,并且因为它们不是语句,所以不必以分号 ( ​​;​​)结尾。

注释

如上所述,注释不影响程序的运行;然而,它们提供了一个重要的工具,可以直接在源代码中记录程序的功能和运行方式。


C++ 支持两种注释代码的方式:

// line comment
/* block comment */

第一个,称为行注释,丢弃从找到斜杠 ( ​​//​​) 到同一行末尾的所有内容。第二个,称为块注释,丢弃​​/*​​​字符和字符第一次出现之间的所有内容​​*/​​,可能包含多行。


让我们为第二个程序添加注释:

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

#include

int main ()
{
std::cout << "Hello World! "; // prints Hello World!
std::cout << "Im a C++ program"; // prints Im a C++ program
}

如果在程序的源代码中包含注释而不使用注释字符组合​​//​​​,​​/*​​​或​​*/​​,编译器会将它们视为 C++ 表达式,很可能会导致编译失败并显示一个或多个错误消息。


使用命名空间 std

如果您之前看过 C++ 代码,您可能已经看到​​cout​​​使用​​std::cout​​. 两者都命名同一个对象:第一个使用它的非限定名称( ​​cout​​),而第二个直接在命名空间 内限定它​​std​​​(as ​​std::cout​​)。


​cout​​是标准库的一部分,标准 C++ 库中的所有元素都在所谓的命名空间中声明:命名空间​​std​​。


为了参考元素的​​std​​​命名空间的程序应由有资格的每一个使用该库的元素(如,我们通过做前缀​​cout​​​与​​std::​​),或引入其组件的可见性。引入这些组件可见性的最典型方法是使用声明

using namespace std;


上述声明允许​​std​​以非限定方式(不带​​std::​​前缀)访问命名空间中的所有元素。


考虑到这一点,可以重写最后一个示例以对​​cout​​进行不合格的使用:


// my second program in C++
#include
using namespace std;

int main ()
{
cout << "Hello World! ";
cout << "Im a C++ program";
}

访问​​std​​命名空间元素的两种方式(显式限定和使用声明)在 C++ 中都是有效的,并且产生完全相同的行为。为简单起见并提高可读性,这些教程中的示例将更频繁地使用后一种方法和using声明,但请注意,显式限定是保证永远不会发生名称冲突的唯一方法。


命名空间在后面的章节中有更详细的解释。