本篇为 C++ 入门系列第一讲,面向编程初学者系统讲解 C++ 基础语法。内容涵盖第一个 C++ 程序、数据类型、变量常量、操作符等核心知识点,并附有典型代码示例、易错点提示及 OJ 练习建议,助你打牢基础,少走弯路。
目录
![]()
一、你的第一个 C++ 程序:Hello,World
每个程序员的第一行代码,往往都是 Hello, World!。C++ 的第一个程序虽短,却包含多个重要概念:
#include <iostream> // 包含输入输出头文件
using namespace std; // 使用标准命名空间
int main() {
cout << "Hello, World!" << endl;
return 0;
}
关键知识点解析
main函数:程序的唯一入口。无论程序多复杂,都从main()开始执行。注意:- 一个项目中只能有一个
main函数; - 返回类型为
int,结尾必须有return 0;(表示程序正常结束)。
- 一个项目中只能有一个
#include <iostream>:引入标准输入输出流库。没有它,cin和cout无法使用。- C++ 新式头文件无
.h后缀(如<iostream>),而 C 语言头文件在 C++ 中通常加前缀c(如<cmath>代替<math.h>)。
- C++ 新式头文件无
using namespace std;:命名空间声明。std是 C++ 标准库所在空间,包含cout、cin、endl等。- 竞赛写法:直接
using namespace std;,简洁快速; - 工程写法:写成
std::cout,避免命名冲突,更安全。
- 竞赛写法:直接
cin与cout:cin >> var;:从键盘输入数据到变量;cout << var << endl;:向屏幕输出变量值并换行;- 优势:自动识别类型,无需像 C 语言那样写
scanf("%d", &a)。
血泪教训:我曾把 << 和 >> 搞反,结果程序“卡住不动”——因为 cin << xxx 是语法错误!
💡 易错提醒:
<<是流插入(用于cout),>>是流提取(用于cin),别混淆!
二、C++ 的数据类型体系
C++ 提供丰富的数据类型,用于描述不同性质的数据。
1. 基础类型速览
| 类型 | 用途 | 示例 |
|---|---|---|
| char | 字符 | 'A' '@' ' ' |
| int | 整数 | 100 -26 |
| float | 单精度浮点数 | 3.14f |
| double | 双精度浮点数 | 3.1415926 |
| bool | 布尔值 | true / false |
#include<iostream>
using namespace std;
int main()
{
char c = 'a';
int age = 18;
double pi = 3.14159;
bool flag = true;
cout << "c = " << c << endl;
cout << "age = " << age << endl;
cout << "flag = " << flag << endl;
cout << " pi = " << pi << endl;
return 0;
}

ASCII编码
我们知道在计算机中所有的数据都是以⼆进制的形式存储的,那这些字符在内存中分别以什么样的⼆ 进制存储的呢?如果我们每个⼈⾃⼰给这些字符中的每个字符编⼀个⼆进制序列,这个叫做编码,为 了⽅便⼤家相互通信,不造成混乱,后来美国国家标准学会(ANSI)出台了⼀个标准 ASCII 编码,C语 ⾔中的字符就遵循了 ASCII编码 的⽅式。

参考:https://zh.cppreference.com/w/cpp/language/ascii
我们不需要记住所有的ASCII码表中的数字,使⽤时查看就可以,不过我们最好能掌握⼏组特殊的数据:

• 字符 A~Z 的ASCII码值从 65~90
• 字符 a~z 的ASCII码值从 97~122
• 对应的⼤⼩写字符(a和A)的ASCII码值的差值是 32 • 数字字符 0~9 的ASCII码值从 48~57
• 换⾏ \n 的ASCII值是: 10
• ASCII码值从0~31 这32个字符是不可打印字符,⽆法打印在屏幕上观察
#include<iostream>
using namespace std;
int main()
{
char c1 = 'Q';
cout << c1 << endl;
char c2 = 81;
cout << c2 << endl; //这⾥的81是字符Q的ASCII码值,也是可以正常打印的
return 0;
}

2. signed 与 unsigned
- 默认整型/字符型是有符号的(如
int≡signed int); unsigned表示非负整数,扩大正数范围:
unsigned int u = 4000000000U; // 超过 int 最大值,但可存于 unsigned int
⚠️ 注意:char 的符号性由编译器决定!可能是 signed char 或 unsigned char,不要假设。
3. sizeof 操作符:查看类型大小
#include <iostream>
using namespace std;
int main() {
cout << sizeof(int) << endl; // 通常为 4 字节
cout << sizeof(double) << endl; // 通常为 8 字节
int a = 10;
cout << sizeof a << endl; // 变量也可用,括号可省略(但不推荐)
return 0;
}

📏 常见类型长度(32/64 位系统):
char: 1B,bool: 1Bshort: 2B,int: 4Blong: 4B 或 8B,long long: 8Bfloat: 4B,double: 8B
三、变量与常量:程序的“记忆单元”
1. 变量的创建与命名
int score = 95; // 初始化
char grade; // 未初始化(局部变量!危险)
命名规则:
- 以字母或下划线开头;
- 仅含字母、数字、下划线;
- 区分大小写(
score≠Score); - 避免关键字(如
int,return)。
2. 全局变量 vs 局部变量
int global = 2023; // 全局变量:自动初始化为 0(若未赋值)
int main() {
int local = 2018; // 局部变量:不自动初始化!
int global = 10; // 局部变量与全局同名?**局部优先**!
cout << global << endl; // 输出 10
}
🆚 竞赛 vs 企业开发:
- 竞赛:常用全局变量(自动初始化 + 免传参);
- 企业:慎用全局变量(易导致耦合、难维护)。
3. 常量的三种写法
常量就是不能被改变的值,通常我们会使⽤三种常量:
| 方式 | 示例 | 特点 |
|---|---|---|
| 字面常量 | 3.14 , ‘A’ | 直接写在代码中 |
| #define | #define PI 3.14159 | 无类型 ,预处理替换 |
| const | const double PI = 3.14 | 有类型,更安全 |
const double PI = 3.14159;
int r; cin >> r;
cout << "周长: " << 2 * PI * r << endl;
// PI = 3.14; // ❌ 编译错误!const 常量不可修改
✅ 推荐:优先使用 const,类型安全、作用域清晰。
四、算术与赋值操作符:让程序“会计算”
1. 基本算术操作符
int a = 7 + 2; // 9
int b = 7 - 2; // 5
int c = 7 * 2; // 14
int d = 7 / 2; // 3(整数除法,**丢弃小数**)
int e = 7 % 2; // 1(取余,**仅用于整数**)
⚠️ 易错点:
• 整数除法不保留小数!若需浮点结果,至少一个操作数为浮点:7.0 / 2 → 3.5;
• 取模 % 不能用于浮点数;
• 负数取模:符号由被除数决定(-11 % 5 == -1)。
2. 复合赋值操作符
int a = 10;
a += 5; // 等价于 a = a + 5;
a *= 2; // a = a * 2;
a %= 3; // a = a % 3;
💡 建议:可读性优先!复杂逻辑建议拆成多行,便于调试。
五、类型转换:不同类型如何“沟通”?
1. 隐式转换(自动发生)
- 整型提升:
char、short参与运算时自动转为int; - 算术转换:混合类型运算时,向“更高精度”类型转换:
char c = 'a'; // ASCII 97
int i = 10;
char res = c + i; // c+i → int(107),再截断赋给 char
2. 强制类型转换
double d = 3.14;
int a = (int)d; // a = 3(截断小数)
char ch = (char)65; // ch = 'A'
// 打印字符的 ASCII 码
char input; cin >> input;
cout << (int)input << endl;
🔒 注意:强制转换是临时的,不改变原变量类型。
六、单目操作符:++ 与 -- 的陷阱
++(自增)、--(自减)有前置与后置两种形式,行为不同!
int x = 10;
int a = ++x; // 前置:先+1,再赋值 → x=11, a=11
int y = 10;
int b = y++; // 后置:先赋值,再+1 → y=11, b=10
🧠 记忆口诀:
- 前置:先变后用;
- 后置:先用后变。
七、练习建议
✅ OJ 练习推荐(洛谷 / 牛客)
- 入门题:A+B Problem 打印字符三角形;
- 进阶题:鸡兔同笼、打印ASCLL码值、浮点数向0舍入;
- 重点关注:数据范围(是否需
long long?)、输入输出格式。
📌 经典忠告:“十年 IO 一场空,不开 long long 见祖宗” —— 务必根据题目数据范围选择合适类型!
🤔 思考题
- 为什么
char类型的符号性由编译器决定?这在跨平台开发中可能带来什么问题? - 在什么场景下,使用
#define定义常量反而比const更合适?
欢迎在评论区留下你的答案或疑问!



1062

被折叠的 条评论
为什么被折叠?



