这节课我们将为大家系统介绍C++的基础组成部分,包括类型、变量、表达式、语句以及函数等内容。 与此同时,大家会了解如何编写、编译并运行一个C++程序,帮助你建立起从代码到可执行程序的完整认知。 通过本部分的学习与练习,你将能够独立编写、编译并运行简单的C++程序。
同时在最后面,我们会为大家提供一个可交互的实验室,帮助你更好地理解C++的各个知识点。

每一种编程语言的学习,几乎都从“Hello, World!”程序开始。这个传统不仅仅是因为它简单易懂,更重要的是它能帮助你快速体验从编写代码、编译到运行的完整流程。 通过输出一句简单的话,你可以验证开发环境是否配置正确,并初步感受C++的基本语法结构。
下面就是一个最简单的C++“Hello, World!”程序:
|#include <iostream> int main() { std::cout << "Hello, World!" << std::endl; return 0; }
让我们逐行分析这个程序,理解每个部分的作用:
|#include <iostream>
这行代码告诉编译器我们需要使用输入输出流库。#include 是一个预处理指令,它会在编译之前将指定的头文件内容插入到当前文件中。<iostream> 是C++标准库中处理输入输出的头文件,它包含了 std::cout、std::cin 等对象的定义。
#include 是最常用的预处理指令之一。
|int main() {
这是程序的入口点,每个C++程序都必须有一个名为 main 的函数。我们之后会详细介绍函数的定义,现在你只需要知道这个函数是程序的起点,程序从这里开始执行。
int 表示这个函数返回一个整数值,() 表示这是一个函数,大括号 {} 包含了函数的主体。
|std::cout << "Hello, World!" << std::endl;
这行代码负责在屏幕上输出文本。std::cout 是标准输出流对象,<< 是输出操作符,用于将数据发送到输出流。"Hello, World!" 是一个字符串字面量,会被原样输出。std::endl 是一个特殊的操作符,它会输出一个换行符并刷新输出缓冲区。
命名空间(namespace):std:: 表示这些对象(如 cout、endl 等)属于C++标准库的命名空间 std。
命名空间的作用是将相关的标识符(如变量、函数、类等)组织在一起,防止与其他库或你自己定义的同名标识符发生冲突。
在C++中,标准库的大部分内容都放在 std 命名空间下,因此我们在使用这些内容时需要加上 std:: 前缀。
例如,std::cout 表示标准输出流对象,std::endl 表示换行并刷新缓冲区。如果不想每次都写 std::,也可以在代码开头加上 using namespace std;,但在大型项目中推荐显式使用前缀以避免歧义。
|return 0; }
return 0; 表示程序正常结束,返回值为0。在C++中,main 函数返回0通常表示程序成功执行,非0值表示程序出现了错误。最后的大括号 } 标志着 main 函数的结束。
这个简单的程序展示了C++程序的基本结构:头文件包含、主函数定义、语句执行和返回值。虽然只有几行代码,但它包含了C++程序的核心要素。 当你运行这个程序时,它会在控制台输出 "Hello, World!" 并换行,然后程序结束。 这个看似简单的输出,实际上涉及了字符串处理、输出流操作、函数调用等多个C++核心概念。
输入与输出是编程中非常重要的概念,它使得程序能够与用户进行交互,接收输入并输出结果。
C++ 语言本身并没有内置输入输出语句,而是通过标准库来实现这些功能。最常用的输入输出库是 iostream,其中定义了 istream 和 ostream 两种类型,分别代表输入和输出。
标准库为我们准备了几个常用的输入输出对象。cin 是标准输入流对象,通常用来从键盘读取数据;cout 是标准输出流对象,用来向屏幕输出内容。
此外还有 cerr 和 clog,分别用于输出错误信息和一般日志信息。
通常情况下,这些对象都和程序运行的窗口关联在一起,也就是说,输入输出都发生在你看到的终端窗口里。
下面我们看一个实际的例子,来学习如何用 C++ 实现输入和输出。假设我们要编写一个程序,提示用户输入两个数字,然后输出它们的和。代码如下:
|#include <iostream> int main() { int num1 = 0, num2 = 0; std::cout << "请输入两个数字:" << std::endl; std::cin >> num1 >> num2; // 读取用户输入的两个数字 std::cout << "它们的和是:" << num1 + num2 << std::endl; return
让我们逐行分析这个程序,理解每个部分的作用:
我们要想计算两个数字的和,我们一定要在程序中定义两个变量来存储这两个数字。
|int num1 = 0, num2 = 0;
上述代码定义了两个整型变量,并且将它们初始化为 0。
随后程序通过 std::cout 输出提示信息 "请输入两个数字:",然后等待用户输入。
|std::cout << "请输入两个数字:" << std::endl;
接下来,std::cin >> num1 >> num2; 这行代码会从标准输入流读取两个整数,分别存入 num1 和 num2。
输入操作符 >> 的用法和输出操作符类似,可以连续读取多个值。
当用户输入两个数字并按下回车后,程序会继续执行,利用 std::cout 输出结果。
这里的输出语句稍微复杂一些,它将字符串和变量、表达式混合在一起,通过多次使用 << 操作符,将所有内容依次输出到屏幕上。
比如,"请输入两个数字:" 是字符串,num1 和 num2 是数字变量,num1 + num2 是表达式,std::endl 负责换行并刷新缓冲区。
在我们学习更复杂的C++程序之前,先来了解一下“注释”在C++中的作用和写法。 注释是写给人看的,不是给计算机看的。它们的存在,是为了让我们自己或者其他人更容易理解代码的含义。 比如说,你可以用注释来简单描述一个算法的思路,说明某个变量的用途,或者解释一段看起来比较难懂的代码。 编译器在处理代码时会自动忽略所有注释内容,所以注释不会影响程序的运行结果,也不会让程序变慢。
虽然编译器不在乎注释,但读代码的人非常在意。很多程序员在阅读代码时,往往会首先相信注释的内容,甚至比相信其他文档还要多。 如果注释写错了,反而会误导别人,这比没有注释还糟糕。所以每当你修改了代码,一定要记得同步更新相关的注释。
就好像我们在上述的例子中,在代码的旁边写上了注释,来解释代码的含义。
C++里有两种注释方式。第一种是“单行注释”,它以两个斜杠 // 开头,从这两个斜杠开始到本行结尾,全部都是注释内容。你可以在 // 后面写任何文字,甚至可以再写 //,编译器都会忽略掉。
|// 这是一个单行注释 // 我会在注释中写上一些文字,来解释代码的含义
第二种是“多行注释”,它是从 C 语言继承过来的。多行注释以 /* 开头,以下一个 */ 结束。无论中间有多少行,甚至有换行,编译器都会把 /* 和 */ 之间的所有内容当作注释。
你可以把多行注释放在代码的任何地方,只要那里允许出现空格、制表符或换行就行。如果注释内容跨越多行,很多人喜欢在每一行前面加一个星号 *,这样一眼就能看出哪些内容属于同一个注释块。
|/* 这是一个多行注释 我会在注释中写上一些文字,来解释代码的含义 */
实际写程序时,这两种注释经常会混合使用。多行注释适合写比较长的说明,比如解释一个函数的整体思路;而单行注释更适合在代码旁边写一句简短的说明,比如解释某个变量的含义。
虽然注释不会影响程序的运行,但是它对程序的阅读者来说非常重要!一个优秀的程序员,一定会在必要的地方添加注释,来解释代码的含义!
在编写程序时,大多数语句会按照书写的顺序依次执行:先执行第一句,再执行第二句……但实际上,几乎没有哪个有用的程序只靠顺序执行就能完成任务。 我们经常需要让程序根据不同的情况选择不同的执行路径,或者让某些操作重复多次。这就需要“流程控制”语句。
流程控制是编程中非常重要的内容,它让我们的程序变得灵活和强大。C++ 提供了多种流程控制语句,比如条件判断(if)、循环(while、for)等。本节我们先来学习最基础的循环语句——while。
什么是 while 循环?
while 循环可以让一段代码反复执行,只要指定的条件成立。比如,我们想让计算机把 1 加到 10,然后把结果输出,就可以用 while 循环来实现。
让我们来看一个完整的例子:
|#include <iostream> int main() { int sum = 0, val = 1; // 定义两个变量:sum 用来累计总和,val 从 1 开始 // 只要 val 小于等于 10,就一直执行下面的大括号里的代码 while (val <= 10) { sum = sum + val; // 把 val 加到 sum 上,相当于 sum = sum + val val = val + 1; // val 自增 1,相当于 val = val + 1 } std::cout <<
|运行结果: 1 到 10 的和是:55
#include <iostream>:引入输入输出库,方便我们用 std::cout 输出内容。int main():主函数,程序从这里开始执行。int sum = 0, val = 1;:定义两个整数变量。sum 用来保存累加的结果,初始值为 0;val 是当前要加的数,初始值为 1。while (val <= 10) { ... }:只要 val 小于等于 10,就重复执行大括号里的内容。
sum = sum + val;:把当前的 val 加到 sum 上。val = val + 1;:让 val 增加 1。val 变成 11 时,val <= 10 不成立,循环结束。std::cout << ...:输出最终的结果。|while (条件) { // 循环体:只要条件为真,就会一直执行这里的代码 }
条件是一个表达式,结果要么为真(true),要么为假(false)。只要条件为真,循环体就会执行。例如 2 > 1 为真,2 < 1 为假。循环体可以是一条语句,也可以是一组用大括号括起来的多条语句。你可以把它理解为需要重复执行的代码。
while 循环 可以让一段代码重复执行,直到条件不成立。在循环体内,通常要有让条件发生变化的语句,否则可能会进入“死循环”。通过 while 循环,我们可以很方便地处理重复性的任务,比如累加、计数等。
如果你还有疑问,可以试着自己修改代码,比如把 val <= 10 改成 val <= 100,看看会发生什么!
在前面的 while 循环例子中,我们用变量 val 来控制循环执行的次数:在条件里判断 val 的值,并在循环体内让 val 增加。这种“用变量控制循环次数, 并在循环体内自增变量”的写法非常常见,所以 C++ 语言专门提供了 for 循环,让这种模式写起来更简洁。
我们可以用 for 循环把 1 加到 10 的程序改写如下:
|#include <iostream> int main() { int sum = 0; // 用 for 循环把 1 到 10 累加起来 for (int val = 1; val <= 10; val = val + 1) sum = sum + val; // 等价于 sum += val std::cout << "1 到 10 的和是:" << sum << std
和前面一样,我们先定义 sum 并初始化为 0。不同的是,这次我们把 val 的定义放在了 for 语句的括号里。这样 val 只在 for 循环内部有效,循环结束后就不能再用了。
for 语句的括号里有三个部分:
val <= 10,每次循环开始前都会判断这个条件,只有条件为真才会执行循环体;整个 for 循环的执行流程是这样的:首先创建 val 并赋值为 1,然后判断 val 是否小于等于 10,如果成立就执行循环体,把 val 加到 sum 上。 循环体执行完后,val 增加 1,然后再次判断条件。如果 val 还小于等于 10,就继续执行循环体,否则循环结束,程序继续往下执行。
for 循环让我们写重复操作时更加简洁明了,尤其适合已知次数的循环。你可以把 for 循环理解为“先初始化,再判断条件,条件成立就执行循环体,然后更新变量,再判断条件……直到条件不成立为止”。
和大多数编程语言一样,C++ 提供了 if 语句来支持条件执行。让我们来看一个实际的例子:
|#include <iostream> int main() { int number; std::cout << "请输入一个整数:"; std::cin >> number; if (number > 0) { std::cout << number << " 是正数" << std::endl; } else if (number < 0) {
如果我们运行这个程序并输入不同的数字,会得到不同的输出。比如输入 5,程序会输出"5 是正数";输入 -3,程序会输出"-3 是负数";输入 0,程序会输出"0 是零"。
这个程序展示了 if 语句的基本用法。我们首先定义了一个整型变量 number,然后提示用户输入一个整数。接下来使用 if else-if else 结构来判断这个数字是正数、负数还是零。
第一个 if 语句检查 number 是否大于 0,如果是,就输出"是正数"。如果第一个条件不成立,程序会检查 else if 后面的条件,判断 number 是否小于 0,如果是,就输出"是负数"。如果前面的条件都不成立,程序会执行 else 后面的语句,输出"是零"。
通过这个简单的例子,我们可以看到 if 语句让程序能够根据不同的条件选择不同的执行路径。
现在让我们把前面学到的知识综合起来,创建一个简单的加法计算器。这个程序会读取用户输入的任意数量的数字,然后用 for 循环计算它们的和并输出结果。
|#include <iostream> using namespace std; // 使用命名空间 std,这样就不用每次都写 std:: int main() { int count; // 用来存储用户输入的数字个数 int sum = 0; // 用来存储所有数字的和 cout << "请输入要计算的数字个数:"; cin >> count; cout << "请输入 " << count << " 个数字:" << endl;
这个程序展示了如何将我们学到的各种概念组合在一起。首先,我们使用 using namespace std; 来简化代码,这样就不用每次都写 std:: 前缀了。
程序开始时会询问用户要计算多少个数字的和,用户输入一个数字后,程序会用一个 for 循环来逐个读取这些数字。在循环中,我们定义了一个局部变量 number 来存储每次输入的数字,然后把这个数字加到 sum 变量中。
for 循环的条件 i <= count 确保循环会执行用户指定的次数。每次循环,i 都会增加 1,直到达到用户输入的数字个数。最后,程序输出所有数字的总和。
下面是一个简单的C++小程序,你可以点击任何你不懂的部分,点击后会显示该部分的代码解释!
现在让我们通过一些练习题来巩固本章学到的知识。请尝试独立完成这些题目,如果遇到困难,可以回顾前面的内容。
编写一个程序,输出 Hello, C++! 和 Welcome to programming! 两行文字。
|#include <iostream> using namespace std; int main() { cout << "Hello, C++!" << endl; cout << "Welcome to programming!" << endl; return 0; }
这道题只需要使用 cout 输出两行文字即可。我们使用 endl 来换行,也可以使用 \n 来实现换行。
编写一个程序,定义两个整数变量 a 和 b,分别赋值为 10 和 20,然后交换它们的值并输出交换前后的结果。
|#include <iostream> using namespace std; int main() { int a = 10, b = 20; // 输出交换前的值 cout << "交换前:a = " << a << ", b = " << b << endl; // 交换两个变量的值 int temp = a; // 用一个临时变量保存 a 的值 a =
编写一个程序,输出 1 到 100 之间的所有偶数。
|#include <iostream> using namespace std; int main() { // 从 2 开始,每次增加 2 for (int i = 2; i <= 100; i += 2) { cout << i << " "; } cout << endl; return 0; }
我们也可以使用判断的方式来实现,通过 i % 2 == 0 来判断是否为偶数。但直接从 2 开始每次增加 2 的方式更高效。
交换两个变量的值需要借助一个临时变量。如果我们直接写 a = b; b = a;,那么 a 和 b 都会变成原来的 b 的值,因为 a 的值已经被覆盖了。