C++ 程序设计入门

欢迎来到C++程序设计入门课程。本章将引导你了解构成C++程序的最基本元素,以及一个程序从代码到可执行文件的完整生命周期。这是你踏入信息学竞赛世界的第一步,掌握这些基础概念至关重要。
1. 程序基本概念
● [1] 标识符、关键字、常量、变量、字符串、表达式的概念
这部分内容是C++语言的"词汇"和"短语"。理解它们,就像学习一门新语言的单词和基本语法。
1. 标识符 (Identifier)
1.1 概念介绍
在程序中,我们需要给各种实体(如变量、函数、类等)命名,以便在代码中引用它们。这种用于命名的有效字符序列就是标识符。简单来说,标识符就是程序员自己起的名字。
1.2 创建步骤
- 确定命名对象:想好你要为哪个变量、函数或其他实体命名。
- 遵循命名规则:
-
- 只能由字母(A-Z, a-z)、数字(0-9)和下划线(_) 组成。
- 第一个字符必须是字母或下划线,不能是数字。
- 区分大小写 ,例如
myVar
和myvar
是两个不同的标识符。 - 不能是C++的关键字 (如
int
,if
,for
等)。
- 选择有意义的名称 :尽量使用能描述其用途的词语,例如用
student_age
而不是a
来表示学生的年龄。
1.3 算法可视化SVG图示

** **
1.4 核心特性
- 唯一性:在同一作用域内,每个标识符必须是唯一的。
- 描述性:好的标识符能让代码自解释,提高可读性。
- 区分大小写 :
score
和Score
是两个不同的标识符。
1.5 C++代码基础实现
c
#include <iostream>
int main() {
// 合法的标识符示例
int studentAge = 20; // 变量名
double _score = 95.5; // 变量名
int count1 = 100; // 变量名
// 下面的代码会产生编译错误,因为标识符不合法
// int 2way = 0; // 错误:不能以数字开头
// int class = 5; // 错误:'class' 是关键字
std::cout << "Student Age: " << studentAge << std::endl;
return 0;
}
1.6 优化策略(命名规范)
- 驼峰命名法 (CamelCase) :第一个单词首字母小写,之后每个单词首字母大写。如
myVariableName
。 - 帕斯卡命名法 (PascalCase) :所有单词首字母都大写。常用于类名。如
MyClassName
。 - 下划线命名法 (snake_case) :单词之间用下划线分隔。如
my_variable_name
。 - 在竞赛中,为了速度,有时会使用简短的命名(如
i
,j
,n
,k
),但对于复杂问题,推荐使用有意义的命名。
1.7 优缺点
- 优点:
-
- 提高了代码的可读性和可维护性。
- 允许程序员抽象和组织代码。
- 缺点:
-
- 命名不当会严重降低代码可读性,甚至误导读者。
- 过长的命名会增加代码量。
1.8 应用场景
- 定义变量名、常量名。
- 定义函数名、类名、结构体名。
- 定义命名空间。
1.9 扩展
- 作用域 (Scope):标识符的有效范围。可以是全局的(整个程序),也可以是局部的(某个函数或代码块内)。
- 保留标识符:以下划线开头后接大写字母,或包含双下划线的标识符,通常被编译器和标准库保留,应避免使用。
1.10 课后配套练习
-
题目 :判断下列哪些是合法的C++标识符:
a
,_a
,a_1
,1_a
,for
,A
,a-b
,a b
。 -
- 答案 :合法的有
a
,_a
,a_1
,A
。
- 答案 :合法的有
-
题目:定义一个整型变量来存储苹果的数量,并给它赋一个初始值10。
-
-
C++代码实现:
iniint appleCount = 10;
-
-
题目:用驼峰命名法定义一个变量,表示一个学生的平均分。
-
-
C++代码实现:
arduinodouble studentAverageScore;
-
-
题目:用下划线命名法定义一个常量,表示圆周率。
-
-
C++代码实现:
iniconst double PI_VALUE = 3.14159;
-
-
题目:下面的代码有什么错误?请修正它。
iniint my age = 15;
-
-
答案 :标识符
my age
包含空格,是非法的。应改为my_age
或myAge
。iniint myAge = 15; // 或者 int my_age = 15;
-
2. 关键字 (Keyword)
2.1 概念介绍
关键字 是C++语言预先定义好的、具有特殊含义的单词。这些词被C++编译器"保留"了,不能用作标识符。例如 int
用来表示整数类型,if
用来表示条件判断。
2.2 逻辑步骤
- 学习和记忆 :熟悉常用的C++关键字(如
int
,double
,if
,else
,for
,while
,return
,class
等)。 - 识别:在编写代码时,现代的IDE(集成开发环境)通常会用不同的颜色高亮显示关键字。
- 规避:在为变量、函数等命名时,确保不使用任何关键字。
2.3 算法可视化SVG图示

** **
2.4 核心特性
- 预定义:由C++语言标准定义。
- 有特殊意义:每个关键字都有其特定的语法功能。
- 全部小写:C++的关键字都是小写的。
- 保留:不能用作标识符。
2.5 C++代码基础实现
c
#include <iostream>
int main() {
// 'int' 是关键字,用于声明一个整型变量
int number = 10;
// 'if' 和 'else' 是关键字,用于条件控制
if (number > 5) {
std::cout << "Number is greater than 5." << std::endl;
} else {
std::cout << "Number is not greater than 5." << std::endl;
}
// 'for' 是关键字,用于循环
for (int i = 0; i < 3; ++i) {
std::cout << "Loop iteration: " << i << std::endl;
}
// 'return' 是关键字,用于从函数返回值
return 0;
}
2.6 优化策略/最佳实践
- 利用IDE:好的代码编辑器会自动高亮关键字,帮助你识别它们。
- 不尝试"绕过" :不要试图使用类似关键字的标识符(如
_int
),这会降低代码可读性。 - 查阅资料:如果不确定一个词是否是关键字,可以查阅C++关键字列表。
2.7 优缺点
- 优点:
-
- 提供了语言的结构和语法骨架。
- 使编译器能够理解代码的意图。
- 缺点:
-
- 限制了可用的标识符名称。
2.8 应用场景
- 数据类型定义 :
int
,double
,char
,bool
,struct
,class
。 - 流程控制 :
if
,else
,for
,while
,do
,switch
,case
,break
,continue
。 - 函数相关 :
void
,return
,inline
。 - 访问控制 :
public
,private
,protected
。
2.9 扩展
- C++11及以后的新关键字 :现代C++引入了更多关键字,如
auto
,nullptr
,decltype
,constexpr
等,它们提供了更强大的功能。 - 上下文关键字 :如
override
和final
,它们只在特定的上下文中才被视为关键字。
2.10 课后配套练习
-
题目:列出你所知道的至少5个C++关键字。
-
- 答案 :
int
,double
,if
,for
,while
,return
,void
等。
- 答案 :
-
题目 :为什么
int char = 'a';
这行代码是错误的? -
- 答案 :因为
char
是一个关键字,不能用作标识符(变量名)。
- 答案 :因为
-
题目 :用
for
关键字编写一个从1打印到5的循环。 -
-
C++代码实现:
c#include <iostream> int main() { for (int i = 1; i <= 5; ++i) { std::cout << i << " "; } std::cout << std::endl; return 0; }
-
-
题目 :
main
是不是关键字? -
- 答案 :不是。
main
是一个特殊的函数名,作为程序的入口,但它不是语言的保留关键字。你可以定义一个名为main
的变量(虽然极不推荐)。
- 答案 :不是。
-
题目 :使用
if
和else
关键字,判断一个数是奇数还是偶数。 -
-
C++代码实现:
c#include <iostream> int main() { int num = 10; if (num % 2 == 0) { std::cout << num << " is even." << std::endl; } else { std::cout << num << " is odd." << std::endl; } return 0; }
-
3. 常量 (Constant) 与 变量 (Variable)
3.1 概念介绍
- 变量 (Variable) :是程序中用于存储数据的一块内存空间,其存储的值在程序运行过程中可以改变 。变量有三个要素:类型 、名称 (标识符)和值。
- 常量 (Constant) :也是用于存储数据的内存空间,但其值在定义后就不能被修改。常量用于表示固定的值,如圆周率π、一年的天数等。
3.2 算法步骤(定义和使用)
定义变量:
- 指定类型 :确定要存储的数据类型(如
int
表示整数,double
表示小数)。 - 指定名称:为变量起一个合法的标识符。
- (可选)初始化:在定义时赋一个初始值。
-
类型 变量名;
(仅声明)类型 变量名 = 初始值;
(声明并初始化)
定义常量:
- 使用
const
关键字 :在变量定义前加上const
。 - 必须初始化:常量在定义时必须被赋予一个初始值。
-
const 类型 常量名 = 值;
**3.3 算法可视化SVG图示 **

****
- 图示说明 :左侧的变量
score
像一个普通的盒子,里面的值可以从90更新为100。右侧的常量PI
像一个被锁定的盒子,它的值3.14不能被改变。
2.4 核心特性
- 变量:
-
- 可变性:值可以在运行时被程序修改。
- 必须先定义后使用:编译器需要知道变量的类型和名称。
- 常量:
-
- 不可变性:一旦初始化,其值就不能再更改。
- 安全性:防止意外修改重要数据。
- 可读性 :使用有意义的常量名(如
MAX_USERS
)比直接使用数字(如100
)更易于理解。
2.5 C++代码基础实现
c
#include <iostream>
// 使用 #define 定义常量(C风格,不推荐在C++中常用)
#define DAYS_IN_WEEK 7
int main() {
// ---- 变量 ----
int score = 90; // 定义并初始化一个整型变量
std::cout << "Initial score: " << score << std::endl;
score = 95; // 修改变量的值
std::cout << "Updated score: " << score << std::endl;
// ---- 常量 ----
// 使用 const 关键字定义常量(推荐方式)
const double PI = 3.14159;
std::cout << "Value of PI: " << PI << std::endl;
// 下面的代码会产生编译错误,因为常量的值不能被修改
// PI = 3.14;
std::cout << "Days in a week: " << DAYS_IN_WEEK << std::endl;
return 0;
}
2.6 优化策略
- 就近声明:在第一次使用变量之前再声明它,可以缩小其作用域。
- 总是初始化:声明变量时立即给它一个初始值,避免使用未定义的"垃圾值"。
- 优先使用
const
:如果一个值不应该被改变,就把它声明为const
。这能让编译器帮你检查错误,也使代码意图更清晰。 - 常量命名 :通常使用全大写加下划线的方式命名常量,如
MAX_SIZE
,以示区分。
2.7 优缺点
- 变量:
-
- 优点:灵活,是程序动态性的基础。
- 缺点:容易被意外修改,导致程序错误(bug)。
- 常量:
-
- 优点:增强了程序的健壮性和可读性,便于维护(只需修改一处定义)。
- 缺点:缺乏灵活性。
2.8 应用场景
- 变量:
-
- 存储用户输入。
- 循环计数器。
- 保存计算的中间结果或最终结果。
- 常量:
-
- 数学或物理常数(π,e,重力加速度 g)。
- 程序配置(数组最大大小,窗口宽度,最大尝试次数)。
- 固定的状态值。
2.9 扩展
constexpr
:C++11引入的关键字,用于定义"编译时常量"。编译器在编译程序时就能确定其值,可以用于更高级的优化。- 枚举 (
enum
):一种创建一组相关命名常量的方式,例如表示星期几或颜色。
2.10 课后配套练习
-
题目 :声明一个名为
height
的双精度浮点型变量,并初始化为1.75。 -
-
C++代码实现:
inidouble height = 1.75;
-
-
题目 :定义一个名为
SECONDS_PER_MINUTE
的整型常量,值为60。 -
-
C++代码实现:
iniconst int SECONDS_PER_MINUTE = 60;
-
-
题目:尝试修改上题中定义的常量的值,看看编译器会报什么错。
-
-
C++代码实现:
iniconst int SECONDS_PER_MINUTE = 60; SECONDS_PER_MINUTE = 61; // 这行会报错
-
可能的错误信息 :
error: assignment of read-only variable 'SECONDS_PER_MINUTE'
-
-
题目 :交换两个整型变量
a
和b
的值。 -
-
C++代码实现:
c#include <iostream> int main() { int a = 5, b = 10; std::cout << "Before swap: a = " << a << ", b = " << b << std::endl; int temp = a; // 使用一个临时变量 a = b; b = temp; std::cout << "After swap: a = " << a << ", b = " << b << std::endl; return 0; }
-
-
题目:一个程序需要一个数组来存储最多100个学生的分数。你应该用变量还是常量来定义这个大小?为什么?请写出定义。
-
-
答案:应该用常量。因为数组大小在编译时需要确定,并且这个"100"是一个固定的限制,不应在程序运行时被修改。使用常量使得代码更清晰且易于维护。
-
C++代码实现:
iniconst int MAX_STUDENTS = 100; double scores[MAX_STUDENTS];
-