从零开始学 C++:新手入门必知核心语法全解析

本篇为 C++ 入门系列第一讲,面向编程初学者系统讲解 C++ 基础语法。内容涵盖第一个 C++ 程序、数据类型、变量常量、操作符等核心知识点,并附有典型代码示例、易错点提示及 OJ 练习建议,助你打牢基础,少走弯路。

目录

一、你的第一个 C++ 程序:Hello,World

关键知识点解析

二、C++ 的数据类型体系

1. 基础类型速览

ASCII编码

2. signed 与 unsigned

3. sizeof 操作符:查看类型大小

三、变量与常量:程序的“记忆单元”

1. 变量的创建与命名

2. 全局变量 vs 局部变量

3. 常量的三种写法

四、算术与赋值操作符:让程序“会计算”

1. 基本算术操作符

2. 复合赋值操作符

五、类型转换:不同类型如何“沟通”?

1. 隐式转换(自动发生)

2. 强制类型转换

六、单目操作符:++ 与 -- 的陷阱

七、练习建议

✅ 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>:引入标准输入输出流库。没有它,cincout 无法使用。
    • C++ 新式头文件.h 后缀(如 <iostream>),而 C 语言头文件在 C++ 中通常加前缀 c(如 <cmath> 代替 <math.h>)。
  • using namespace std;命名空间声明std 是 C++ 标准库所在空间,包含 coutcinendl 等。
    • 竞赛写法:直接 using namespace std;,简洁快速;
    • 工程写法:写成 std::cout,避免命名冲突,更安全。
  • cincout
    • 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. signedunsigned

  • 默认整型/字符型是有符号的(如 intsigned int);
  • unsigned 表示非负整数,扩大正数范围:
unsigned int u = 4000000000U;  // 超过 int 最大值,但可存于 unsigned int

⚠️ 注意char 的符号性由编译器决定!可能是 signed charunsigned 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: 1B
  • short: 2B, int: 4B
  • long: 4B 或 8B, long long: 8B
  • float: 4B, double: 8B

三、变量与常量:程序的“记忆单元”

1. 变量的创建与命名

int score = 95;          // 初始化
char grade;              // 未初始化(局部变量!危险)

命名规则

  • 以字母或下划线开头;
  • 仅含字母、数字、下划线;
  • 区分大小写scoreScore);
  • 避免关键字(如 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无类型 ,预处理替换
constconst 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. 隐式转换(自动发生)

  • 整型提升charshort 参与运算时自动转为 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 练习推荐(洛谷 / 牛客)

📌 经典忠告“十年 IO 一场空,不开 long long 见祖宗” —— 务必根据题目数据范围选择合适类型!

🤔 思考题

  1. 为什么 char 类型的符号性由编译器决定?这在跨平台开发中可能带来什么问题?
  2. 在什么场景下,使用 #define 定义常量反而比 const 更合适?

欢迎在评论区留下你的答案或疑问!

评论 36
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值