Cpp学习3 第 1 章C++基础
1.1 语句和程序结构
Statements 语句
C++程序中最普通的命令,最小的独立计算单元。大多数以分号结尾。
- 声明语句
- 跳转语句
- 表达式语句
- 复合语句 {}包裹
- 选择语句 if else switch
- 迭代语句 while do-while for
- Try 代码块 和catch搭配使用
函数与main函数
函数是一组按顺序(从上到下)执行的语句。
在讨论函数时,一种相当常见的简写习惯是在函数名的末尾加上一对圆括号。例如,如果你看到 main() 或 doSomething() 这样的术语,这分别是名为 main 或 doSomething 的函数的简写形式。这种写法有助于将函数与具有名称的其他事物(例如变量)区分开来,而无需每次都写出“函数”这个词。
在编程中,函数(或对象、类型、模板等)的名称被称为它的标识符(identifier)。
字符和文本,解析“Hello World!”,语法和语法错误,略。
Quiz
库文件是一组预编译代码的集合,这些代码已被“打包”起来,以便在其他程序中重复使用。C++ 标准库是 C++ 随附的库,它包含可在程序中使用的额外功能。
1.2 注释(Comments)
单行注释 //
多行注释 /* */
正确使用
- 在库、程序或函数级别,使用注释来描述其功能 。
- 在库、程序或函数内部,使用注释来描述其工作原理。
- 在语句层面,使用注释来描述原因 。
给你的代码添加大量的注释,并且要像跟完全不懂代码的人说话一样编写注释。不要指望你会记住当初做出某些选择的原因。
文档生成程序(例如 Doxygen) 旨在帮助用户以各种方式生成和利用文档。
1.3 对象和变量简介
在 C++ 中,不建议直接访问内存。相反,我们通过对象间接访问内存。 对象代表一块可以存储值的区域(通常是 RAM 或 CPU 寄存器)。
虽然 C++ 中的对象可以不命名(匿名),但通常我们使用标识符来命名对象。有名称的对象称为变量 。
定义变量,创建变量,数据类型,定义多个变量,略。
1.4 变量赋值和初始化
C++中有 5 种常见的初始化方式:
1 | int a; // 默认初始化(无初始化器) |
第 14.15 课——类初始化和复制省略中会介绍复制初始化、直接初始化和列表初始化之间的其余区别。
优先选择值初始化,因为它会将变量初始化为一个一致的值。在大多数情况下,这将执行零初始化。
C++17 引入了 [[maybe_unused]] 特性,允许我们告诉编译器某个变量可以未使用。编译器不会对这类变量生成未使用变量警告。
1 | #include <iostream> |
1.5 iostream 简介:cout、cin 和 endl
输入/输出库 (io 库)是 C++ 标准库的一部分,用于处理基本的输入和_输出_ 。我们将使用此库中的功能从键盘获取输入并将数据输出到控制台。iostream 中的 io 部分代表输入/输出。
std::cout
std::cout 是缓冲的。输出不会立刻发送到控制台,而是先发送到用于收集此类请求的内存区域(称为缓冲区 )中。缓冲区会定期刷新。
使用 std::endl 通常效率不高,因为它实际上做了两件事:输出换行符(将光标移动到控制台的下一行)以及刷新缓冲区(速度很慢)。如果我们输出多行以 std::endl 结尾的文本,就会发生多次刷新,这既慢又可能是不必要的。
在向控制台输出文本时,优先使用 \n 而不是 std::endl 。
std::cin
C++ I/O 库本身并不提供无需用户按下_回车键_即可接收键盘输入的方法。如果您需要此功能,则必须使用第三方库。对于控制台应用程序,我们推荐使用 pdcurses 、 FXTUI 、 cpp-terminal 或 notcurses 。许多图形用户界面库也提供了实现此类功能的函数。
std::cin 是缓冲的。
- 您输入的每个字符都会被添加到输入缓冲区(位于
std::cin内部)的末尾。回车键(用于提交数据)也会被存储为换行符'\n'。 - 提取运算符“>>”会移除输入缓冲区开头的字符,并将其转换为一个值,然后通过复制赋值的方式将其赋给关联的变量。该变量随后可在后续语句中使用。
基本提取过程
- 如果
std::cin处于不良状态(例如,先前的提取失败且std::cin尚未被清除),则不会尝试提取,提取过程立即中止。 - 输入缓冲区开头的空白字符(空格、制表符和换行符)将被丢弃。这将丢弃前一行输入中未提取的换行符。
- 如果输入缓冲区为空,运算符
>>将等待用户输入更多数据。输入数据中任何前导空格都将被丢弃。 - 然后,运算符
>>会提取尽可能多的连续字符,直到遇到换行符(表示输入行的结尾)或对于要提取到的变量无效的字符为止。
提取过程的结果如下:
- 如果提取操作在步骤 1 中止,则不会进行任何提取尝试,也不会发生其他任何事情。
- 如果在上述步骤 4 中提取到任何字符,则提取成功。提取的字符将被转换为一个值,然后以复制赋值的方式赋给变量。
- 如果在上述步骤 4 中无法提取任何字符,则提取失败。被提取到的对象会被复制赋值
0(从 C++11 开始),并且任何后续的提取操作都会立即失败(直到std::cin被清除)。
任何未提取的字符(包括换行符)都可用于下一次提取尝试。
尝试cin>>x(int)时,
h -> 0; 3.2 -> 3; 3.7 -> 3; -3 -> -3; Hello -> 0; 30亿 -> 2147483647
123abd -> 123; abc123 -> 0; +5 -> 5; 5b6 -> 5
1.6 未初始化变量和未定义行为
未初始化的变量
C/C++ 不会自动将大多数变量初始化为给定值(例如零)。当一个未初始化的变量被赋予一个内存地址来存储数据时,该变量的默认值将是该内存地址中已存在的任何(垃圾)值!未被赋予已知值(通过初始化或赋值)的变量称为未初始化变量 。uninitialized variable
“始终初始化变量”
未定义行为
Undefined behavior (often abbreviated UB) 是指执行 C++ 语言未明确定义行为的代码所导致的结果。
务必避免所有会导致未定义行为的情况,例如使用未初始化的变量。
实现定义的行为和未指定行为
Implementation-defined behavior and unspecified behavior
我们通常希望避免实现定义和未指定的行为,因为这意味着如果使用不同的编译器编译,我们的程序可能无法按预期工作(即使在同一个编译器上,如果我们更改影响实现行为的项目设置,也可能无法按预期工作!)
1.7 关键词和命名标识符
Keywords 关键词
关键字 (或保留字),每个关键字在 C++ 语言中都有其特殊含义。
学完教程就都会了。
标识符命名规则,略。
标识符命名最佳实践
1 | int my_variable_name; // conventional (separated by underscores/snake_case) |
以大写字母开头的标识符名称通常用于用户定义的类型(例如结构体、类和枚举,我们稍后会介绍这些内容)。
- 在现有程序中工作时,应遵循该程序的惯例(即使这些惯例不符合现代最佳实践)。编写新程序时,则应遵循现代最佳实践。
- 避免使用以下划线开头的标识符。虽然语法上合法,但这些名称通常保留给操作系统、库和/或编译器使用。
- 标识符的名称应该清晰地表明它们所代表的值的含义(尤其是在单位不明确的情况下)。标识符的命名方式应该便于完全不了解代码的人快速理解其功能。三个月后,当你再次查看程序时,你可能已经忘记了它的工作原理,但你会感谢自己当初选择了清晰易懂的变量名。
- 避免使用缩写,除非它们是常用且含义明确的缩写(例如
num、cm、idx)。 - 对于变量声明,使用注释来描述变量的用途或解释其他可能不明显的含义非常有用。
1.8 空格和基本格式
空白字符是指用于格式化的字符。在 C++ 中,它主要指空格、制表符和换行符。C++ 中的空白字符通常用于三个方面:分隔特定的语言元素、在文本内部以及用于格式化代码。
请尽量将每行长度控制在 80 个字符以内。
如果用运算符(例如 << 或 +)分割长行,则运算符应放在下一行的开头,而不是当前行的结尾。
现代 IDE 通常包含自动格式化功能,可以重新格式化选定区域(用鼠标选中)或整个文件。
在 Visual Studio 中,可以在 “编辑”>“高级”>“格式化文档” 和 “编辑”>“高级”>“格式化选定内容” 下找到自动格式化选项。
强烈建议使用自动格式化功能,以保持代码格式风格的一致性。
风格指南是一份简洁明了、带有鲜明个人观点的文档,其中包含(有时是人为设定的)编程约定、格式规范和最佳实践。风格指南的目标是确保项目中的所有开发人员都以一致的方式进行编程。
一些常用的 C++ 风格指南包括:
1.9 字面量和运算符简介
1 | std::cout << "Hello world!"; |
这里的“Hello world!”和“5”是字面量literal (a.k.a a literal constant),是直接插入到源代码中的固定值。
在数学中, 运算是指涉及零个或多个输入值(称为操作数 )并产生新值(称为 输出值 )的过程。要执行的具体运算用称为运算符的符号表示。
悉数学中常用的标准算术运算符,包括加法( + )、减法( - )、乘法( * )和除法( / )。在 C++ 中,赋值运算符( = )、插入运算符( << )、提取运算符( >> )和相等运算符( == )也都是运算符。虽然大多数运算符都有对应的符号(例如 + 或 == ),但也有一些运算符是关键字(例如 new 、 delete 和 throw )。
加号运算符可以写成 operator+ ,提取运算符可以写成 operator>> 。
有些运算符具有额外的行为。除了产生返回值之外,如果一个运算符(或函数)还具有可观察的效果,则称该运算符具有副作用 。例如, x = 5 的副作用是将值 5 赋给变量 x 。即使运算符执行完毕, x 的值变化仍然是可观察的(例如,通过打印 x 的值)。std std::cout << 5 的副作用是将 5 打印到控制台。即使 std::cout << 5 执行完毕,我们仍然可以观察到值 5` 已被打印到控制台。
operator= 和 operator<< (用于向控制台输出值时)都会返回其左操作数。因此, x = 5 返回 x ,而 std::cout << 5 返回 std::cout 。这样做是为了方便这些运算符链式调用。
1.10 表达式简介
Expressions
在一般编程中, 表达式是由字面量、变量、运算符和函数调用组成的非空序列,用于计算一个值。执行表达式的过程称为求值 ,而产生的结果值称为表达式的结果 (有时也称为返回值 )。
Expression statements
我们前面提到过,表达式本身不能执行——它们必须作为语句的一部分存在。幸运的是,将任何表达式转换为等价语句非常简单。 表达式语句是由一个表达式和一个分号组成的语句。当执行表达式语句时,表达式的值将被计算。
1.11 开发你的第一个程序
1.x 第一章总结和测验
- 标题: Cpp学习3 第 1 章C++基础
- 作者: 铁名_IronName
- 创建于 : 2026-08-06 12:50:47
- 更新于 : 2026-08-08 09:45:28
- 链接: https://blog.ironname.top/2026/Cpp/Cpp学习3/
- 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。