跳转至内容

C++ 编程/示例/Hello world

来自 Wikibooks,开放世界中的开放书籍

Hello World - 编写、编译和运行 C++ 程序

[编辑 | 编辑源代码]

下面是一个简单的 C++ 程序示例

// 'Hello World!' program 
 
#include <iostream>
 
int main()
{
  std::cout << "Hello World!" << std::endl;
  return 0;
}


编写程序时,您需要使用开发环境。您的开发环境可以是基本的文本编辑器,也可以是功能丰富的 C++ 集成开发环境 (IDE)。您不应使用文字处理软件(如 Microsoft Word),因为它们会向文本添加格式化代码。

如果您还没有可用的编译器,请参阅本书的从哪里获取编译器部分

打开您的开发环境,输入显示的程序(或复制并粘贴),并将其保存为hello.cc

现在使用 C++ 编译器编译它

COMMAND_PROMPT> g++ hello.cc -o hello

此示例使用 GCC,即 GNU 编译器集合(http://gcc.gnu.org),但您可以使用任何其他编译器,或使用 IDE 进行编译。上述命令将生成一个名为hellohello.exe的可执行文件。调用可执行文件以运行您的第一个 C++ 程序

Unix

COMMAND_PROMPT> ./hello
Hello World!
COMMAND_PROMPT>

Microsoft Windows

COMMAND_PROMPT> dear hello
Hello World!
COMMAND_PROMPT>

斜体文本由您键入,而粗体文本由程序输出。如果您使用IDE,它可能会根据语法自动为您着色代码。

疑难解答

[编辑 | 编辑源代码]
g++
未找到命令

您没有安装 GNU C++ 编译器。如果您有其他编译器,请查看其文档以获取正确的编译命令。

注意
有关如何获取编译器以及如何在从哪里获取编译器部分中安装编译器的详细信息。
附录 B:外部链接中,您还可以找到其他免费编译器甚至您可以使用的完整 IDE 的参考。

编译器命令错误

许多奇怪的错误,多次提及

undefined reference to `std::basic_ostream' [..]

通常以以下结尾

collect2: ld returned 1 exit status

要使用g++编译您的 hello.cc,请使用

g++ hello.cc -o hello

对于gcc,使用

gcc hello.cc -o hello -lstdc++

注意
为简单起见,我们假设文件位于您正在使用的路径中…

hello
未找到命令

您没有键入完整路径,请尝试

./hello

是否有hello此目录中的程序?当您键入时,您能看到它吗?ls?如果不是,则您的编译(g++ hello.cc -o hello)失败或您已切换到错误的目录。

如果您未指定-o hello, g++命名输出文件a.out汇编程序输出),出于历史原因。在这种情况下,请键入

./a.out

以执行程序。

你的第一个 C++ 程序解释

[编辑 | 编辑源代码]

预处理指令

[编辑 | 编辑源代码]

C++ 的一些特性是语言的一部分,而另一些特性则是标准库的一部分。标准库是一组代码,每个符合标准的 C++ 编译器都提供该代码。当 C++ 编译器编译您的程序时,它通常还会将其与标准 C++ 库链接。

当您使用库中的特性时,C++ 要求您声明将要使用的特性。程序中的第一行是预处理指令。在我们的示例中,它显示为粗体和斜体

IOStreams 的预处理指令
 #include <iostream>

此行导致 C++ 声明(位于iostream 头文件中)被包含在您的程序中以供使用。通常,编译器会将名为iostream头文件的内容插入到程序中。它放在哪里取决于系统。此类文件的位置可能在编译器的文档中进行描述。标准头文件参考表中列出了标准 C++ 头文件。

iostream头文件包含用于输入/输出 (I/O) 的各种声明。它使用称为的 I/O 机制的抽象。例如,有一个名为std::cout的输出流对象,用于将文本输出到标准输出。通常,这会将文本显示在计算机屏幕上。

预处理器是编译器的一部分,它在实际编译器看到代码之前对代码进行一些转换。例如,在遇到#include <iostream>指令时,它会将指令替换为iostream头文件的内容。

main函数

[编辑 | 编辑源代码]
int main()
{
    // ...
}

以上几行表示一段 C++ 代码块,命名为main。在 C++ 中,这样的命名代码块称为函数。块的内容称为函数的主体

单词int显示为粗体,因为它是一个关键字。C++ 关键字具有一些特殊含义,并且也是保留字,即不能用于除其预期用途之外的任何目的。另一方面main不是关键字,您可以在许多关键字无法使用的地方使用它(尽管不建议这样做,因为可能会导致混淆)。

每个(符合标准的)C++ 程序都必须定义一个名为main的函数。程序的执行从这里开始。正如我们稍后将看到的,main可以调用其他函数,这些函数又可以调用其他函数。编译器安排在程序开始执行时调用main函数。(虽然这通常是正确的,但并非总是如此。对于在最开始就执行main,有一个例外,我们将在稍后看到。)

现在让我们看一下main函数内部的代码。

打印 Hello World!

[编辑 | 编辑源代码]

中的第一行main使用std::cout对象打印字符串(字符序列)Hello World!并结束行

std::cout << "Hello World!\n";

此行是C++ 语句。C++ 语句以分号 (;) 结尾。在语句<<中,称为插入运算符的运算符用于使用std::cout流输出字符串。C++ 字符串用双引号 (") 括起来。引号本身不是字符串的一部分,因此不会打印。序列\n用于字符串中表示当前行的结尾。尽管该序列由两个字符表示,但它仅占用一个字符的内存空间。因此,序列\n称为换行符。换行的实际过程取决于系统,但 C++ 标准库会为您处理,而无需您了解。

注意
C 程序员不应将插入运算符与 C 中的按位移位运算符混淆。C++ 具有称为运算符重载的特性,它允许<<的两种解释共存。在 C++ 中,I/O 是<<>>的主要用途,而位移位则相对不常用。

上述程序的修改

[编辑 | 编辑源代码]

以下是同一程序,但进行了细微修改

// This program just displays a string and exits
#include <iostream>
 
int main()
{
  std::cout << "Hello World!";
  std::cout << std::endl;

  return 0;
}

开头添加的行

// This program just displays a string and exits

是一条试图解释代码作用的注释。注释对于任何非简单的程序来说都是必不可少的,这样阅读代码的人就能理解它预期要做什么。注释分隔符之间包含的内容没有限制。编译器只是忽略注释中所有存在的内容。在我们的示例中,注释以斜体显示。C++ 支持两种形式的注释。

  • 单行注释以//开头,并延伸到行尾。这些也可以用于语句的右侧来解释该语句的作用。
  • 多行注释以/*序列开头,并以*/序列结尾。这些可用于跨越多行的注释。这些也被称为 C 样式注释,因为这最初是 C 中唯一可用的注释类型。例如:
/* This program displays a string
   and then it exits */

注释有时也用于包含我们暂时希望编译器忽略但打算以后使用的代码。这在**调试**(查找程序中的**错误**或错误的过程)中非常有用。如果程序没有给出预期的结果,通过“注释掉”代码,就可以追踪哪个特定的语句存在错误。由于 C 样式注释可以在行尾之前停止,因此可以用来“注释掉”程序中一行内的代码小部分。

刷新输出流缓冲区

[编辑 | 编辑源代码]

每当你写入(即发送任何输出)到输出流时,它不会立即被写入。它首先存储在内存中,实际上可能在将来的任何时间写入。此过程称为缓冲,用于存储此类临时数据的内存区域称为缓冲区。有时需要刷新输出流缓冲区以确保所有数据都已写入。这是通过将插入运算符应用于输出流和对象std::endl来实现的。这就是该行所做的操作

std::cout << std::endl;

在刷新缓冲区之前,std:endl还会写入一个换行符(这解释了它的名称,end line)。因此,在上一行打印的字符串中省略了换行符。

返回成功代码

[编辑 | 编辑源代码]

在大多数操作系统中,每个程序都允许使用一个称为退出状态的值与其调用者通信,以指示它是否成功完成执行。按照惯例,退出状态为 0 表示成功,任何其他值都表示失败。退出状态的不同值可用于指示不同类型的失败。在我们的简单程序中,我们希望以状态 0 退出。

C++ 允许main函数返回一个整数值,该值将作为程序的退出状态传递给操作系统。语句

return 0;

使main返回 0 值。由于main函数需要返回一个整数,因此关键字int用于开始函数定义。此语句是可选的,因为编译器会自动生成代码以在控制掉落而没有main函数返回 0。这就是第一个程序无需任何 return 语句即可工作的原因。请注意,这只是一个仅适用于return语句的情况下为main函数的特殊情况。对于其他函数,如果它们声明为返回任何内容,则必须返回一个值。

常见编程错误 1 虽然return语句是可选的,main不应声明为返回void(声明为void的函数是不返回任何内容的函数),如 Java 等其他一些语言中那样。一些 C++ 编译器可能不会对此抱怨,但这是不正确的。这样做可能等同于返回碰巧存储在特定内存位置或寄存器中的任何随机数字,具体取决于平台。此做法也可能对某些操作系统造成潜在损害,这些操作系统依赖于返回代码来确定如何处理崩溃或其他异常退出。

空白和缩进

[编辑 | 编辑源代码]

空格、制表符和换行符(换行符)通常称为空白。除了预处理指令和 C++ 样式注释在换行符处结束的规则外,这些都被编译器忽略,除非在引号内。因此,上面的程序也可以这样编写

// This program just displays a string and exits, variation 1
#include <iostream>

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

但是,请注意,需要空格来分隔相邻的单词和数字。为了使程序更易读,必须适当地使用空白。

使用空白来提高代码可读性时遵循的约定构成了缩进样式。例如,使用备选缩进样式,程序可以这样编写

// This program just displays a string and exits, variation 2
#include <iostream>
 
int main() {
  std::cout << "Hello World!";
  std::cout << std::endl;

  return 0;
}

或这样

// This program just displays a string and exits
#include <iostream>
 
int main()
{
  std::cout << "Hello World!";
  std::cout << std::endl;

  return 0;
}
华夏公益教科书