C++ 的基本语法是理解和掌握这门强大编程语言的第一步。下面我将详细梳理,内容会涵盖程序结构、注释、变量与数据类型、运算符、控制结构、函数等核心概念。
🖥 一、程序结构与 Hello World
每个 C++ 程序都有一个基本的结构框架,通常包括头文件包含、命名空间使用和主函数 main()
。
#include <iostream> // 包含输入输出流头文件
using namespace std; // 使用标准命名空间
int main() { // 主函数,程序执行的入口点
cout << "Hello, World!" << endl; // 输出 "Hello, World!" 并换行
return 0; // 返回 0,表示程序正常结束
}
#include <iostream>
:这是一个预处理指令,用于引入标准输入输出库,使我们能够使用cin
(标准输入)和cout
(标准输出)等对象。using namespace std;
:这行代码声明使用标准命名空间std
。cout
和endl
等都定义在std
命名空间中。使用这行代码后,就不必每次都写std::cout
,直接写cout
即可。int main()
:这是程序的主函数,是任何可执行 C++ 程序的入口点。程序从这里开始执行。cout << ... << endl;
:cout
是标准输出流对象,用于向控制台(屏幕)输出信息。<<
是流插入运算符,用于将内容插入到输出流中。endl
是一个操纵器,表示插入换行符并刷新输出缓冲区。return 0;
:main
函数返回一个整数给操作系统。返回0
通常表示程序成功执行。其他非零值通常用于指示不同的错误类型。
一个稍复杂的程序结构可能还包括全局变量、函数声明等:
#include <iostream>
#include <string> // 引入字符串支持
// 全局常量声明
const double PI = 3.14159;
// 函数声明 (函数原型)
double calculateArea(double radius);
int main() {
// 局部变量
std::string message = "Learning C++";
// 使用 std:: 前缀,因为未使用 using namespace std;
// ... 其他逻辑,比如调用 calculateArea 函数
return 0;
}
// 函数定义
double calculateArea(double radius) {
return PI * radius * radius;
}
💬 二、注释 (Comments)
注释是代码中非执行的部分,用于解释代码、提高可读性或临时禁用代码。C++支持两种注释:
单行注释:以
//
开始,直到行末。// 这是一个单行注释 int age = 25; // 声明一个整型变量并初始化
多行注释:以
/*
开始,以*/
结束,可以跨越多行。/* 这是一个多行注释, 可以包含很多行内容。 常用于函数或文件的头部说明 */
🔢 三、变量与常量 (Variables & Constants)
变量是用于存储数据的命名内存空间,其值可以改变。常量是其值在程序运行期间不可改变的量。
1. 变量
声明与初始化:变量需指定其数据类型,可以在声明时初始化,也可以先声明后赋值。
int age; // 声明一个整型变量 age (未初始化,其值不确定) age = 25; // 为变量 age 赋值 double price = 99.99; // 声明一个双精度浮点变量 price 并初始化 char grade = 'A'; // 声明一个字符变量 grade 并初始化 bool isOnline = true; // 声明一个布尔变量 isOnline 并初始化
2. 常量
使用
const
关键字声明常量,必须在声明时初始化,且之后不能修改。const double PI = 3.1415926; // 声明一个双精度浮点常量 PI const int MAX_SIZE = 100; // 声明一个整型常量 MAX_SIZE // PI = 3.14; // 错误!常量的值不可修改
常量命名通常推荐使用大写字母和下划线,以增强可读性。
变量与常量的区别
特性 | 变量 | 常量 |
---|---|---|
是否可变 | 值可以改变 | 值一旦初始化便不可改变 |
声明方式 | 数据类型 变量名; |
const 数据类型 常量名 = 值; |
初始化 | 可以在声明时或后续代码中初始化 | 必须在声明时初始化 |
内存分配 | 运行时在内存中分配空间 | 编译时常量可能被直接替换到代码中 |
📊 四、数据类型 (Data Types)
C++ 是一种静态类型语言,要求在编译时明确所有变量的类型。数据类型决定了变量存储的大小和布局、值的范围以及可执行的操作。
C++ 的数据类型大致可分为:
- 基本内置类型 (Fundamental/Built-in Types)
- 派生类型 (Derived Types)
- 用户自定义类型 (User-defined Types)
下面是一个关于常见基本数据类型的表格,包含了它们的典型大小和用途:
数据类型 | 含义 | 典型大小 | 取值范围或描述 | 示例 |
---|---|---|---|---|
int |
整型 | 4 字节 | -2,147,483,648 到 2,147,483,647 | int count = 100; |
short |
短整型 | 2 字节 | -32,768 到 32,767 | short s = 32767; |
long |
长整型 | 4 或 8 字节 | 范围更大 | long l = 100000L; |
long long |
超长整型 | 8 字节 | −9.2×10¹⁸ 到 9.2×10¹⁸ | long long ll = ... |
float |
单精度浮点型 | 4 字节 | 约 ±3.4e±38,6-7 位有效数字 | float f = 3.14f; |
double |
双精度浮点型 | 8 字节 | 约 ±1.7e±308,15-16 位有效数字 | double d = 3.14159 |
long double |
扩展精度浮点型 | 8, 12 或 16 字节 | 精度和范围更大 | long double ld = ... |
char |
字符型 | 1 字节 | 通常表示字符(如 ‘A’),也可表示小整数(-128 到 127 或 0 到 255) | char c = 'A'; |
bool |
布尔型 | 1 字节 | true 或 false |
bool flag = true; |
void |
无类型 | N/A | 主要用于指示函数不返回任何值 | void func(); |
类型修饰符:signed
(有符号,默认)和 unsigned
(无符号,仅表示非负数)可以用于修饰整型,改变其取值范围。例如 unsigned int positiveNumber = 42;
。
类型转换:
隐式转换(自动转换):编译器自动进行,例如在整数和浮点数混合运算时,整数会转换为浮点数。
int num = 10; double result = num / 4.0; // num 被隐式转换为 double 类型参与计算
显式转换(强制转换):程序员手动指定转换。
double pi = 3.14159; int approxPi = (int)pi; // C风格强制转换,approxPi 为 3 int anotherApprox = static_cast<int>(pi); // C++风格强制转换,更安全推荐[1](@ref)
🧮 五、运算符 (Operators)
运算符用于执行各种运算和操作。
1. 算术运算符
用于基本的数学计算。
运算符 | 描述 | 示例 | 结果 (设 a=10, b=3) |
---|---|---|---|
+ |
加法 | a + b |
13 |
- |
减法 | a - b |
7 |
* |
乘法 | a * b |
30 |
/ |
除法 | a / b |
3 (整数除法) |
/ |
除法 | 10.0 / 3.0 |
3.333… (浮点除法) |
% |
取模(取余) | a % b |
1 (10除以3的余数) |
注意:整数除法会截断小数部分。
2. 关系运算符
用于比较两个值的大小关系,返回 true
(1) 或 false
(0)。
运算符 | 描述 | 示例 | 结果 (设 x=5, y=10) |
---|---|---|---|
== |
等于 | x == y |
false (0) |
!= |
不等于 | x != y |
true (1) |
> |
大于 | x > y |
false (0) |
< |
小于 | x < y |
true (1) |
>= |
大于等于 | x >= y |
false (0) |
<= |
小于等于 | x <= y |
true (1) |
3. 逻辑运算符
用于连接或修改布尔逻辑条件,返回 true
或 false
。
运算符 | 描述 | 示例 | 结果 |
---|---|---|---|
&& |
逻辑与 | true && false |
false (两边都为真才为真) |
` | ` | 逻辑或 | |
! |
逻辑非 | !true |
false (取反) |
短路求值:逻辑与 (&&
) 和逻辑或 (||
) 运算符支持短路求值。例如,a && b
,如果 a
为 false
,则不会计算 b
的值,因为结果已确定是 false
。
4. 赋值运算符
用于给变量赋值。
运算符 | 例子 | 等价于 |
---|---|---|
= |
a = b |
a = b |
+= |
a += b |
a = a + b |
-= |
a -= b |
a = a - b |
*= |
a *= b |
a = a * b |
/= |
a /= b |
a = a / b |
%= |
a %= b |
a = a % b |
… | … | … |
5. 递增和递减运算符
用于将变量的值增加或减少 1。
运算符 | 描述 | 效果 |
---|---|---|
++a |
前置递增 | 先加1,然后返回新的值 |
a++ |
后置递增 | 先返回原来的值,然后加1 |
--a |
前置递减 | 先减1,然后返回新的值 |
a-- |
后置递减 | 先返回原来的值,然后减1 |
示例:
int a = 5;
int b = ++a; // a 先变为 6,然后 b 被赋值为 6
int c = a++; // c 被赋值为 6,然后 a 再变为 7
6. 其他运算符
三元条件运算符 (
? :
):简单的条件判断。int a = 10, b = 20; int min = (a < b) ? a : b; // 如果 a < b 为真,min = a,否则 min = b
逗号运算符 (
,
):从左到右依次计算表达式,整个表达式的值是最后一个表达式的值。int a = (1, 2, 3); // a 的值为 3
位运算符:对整数在二进制位层次上进行操作,如
&
(按位与),|
(按位或),^
(按位异或),~
(按位取反),<<
(左移),>>
(右移)。sizeof
运算符:返回类型或对象的大小(字节数)。cout << sizeof(int) << endl; // 通常输出 4
🚦 六、控制结构 (Control Structures)
控制结构用于控制程序的执行流程。
1. 条件语句
if 语句:
int score = 85; if (score >= 90) { cout << "优秀" << endl; } else if (score >= 80) { cout << "良好" << endl; } else if (score >= 70) { cout << "中等" << endl; } else { cout << "待提高" << endl; } // 输出:良好
switch 语句:基于一个整型或枚举表达式的值进行多分支选择。
char grade = 'B'; switch (grade) { case 'A': cout << "Excellent" << endl; break; // 跳出 switch case 'B': case 'C': // 多个 case 可以共享同一段代码 cout << "Well done" << endl; break; case 'D': cout << "Pass" << endl; break; default: // 所有 case 都不匹配时执行 cout << "Invalid grade" << endl; } // 输出:Well done
注意:忘记
break
会导致** case 穿透**,继续执行下一个case
的语句。
2. 循环语句
for 循环:适合已知循环次数的场景。
// 打印 0 到 4 for (int i = 0; i < 5; i++) { // 初始化; 条件; 更新 cout << i << " "; } cout << endl;
范围 for 循环 (C++11):简化对容器(如数组)的遍历。
int arr[] = {1, 2, 3, 4, 5}; for (int element : arr) { // 遍历数组 arr 的每个元素 cout << element << " "; } cout << endl;
while 循环:先判断条件,再执行循环体。适合不确定循环次数但需条件满足才执行的场景。
int count = 5; while (count > 0) { cout << count << " "; count--; } cout << endl; // 输出:5 4 3 2 1
do-while 循环:先执行一次循环体,再判断条件。循环体至少执行一次。
int input; do { cout << "Enter a positive number (0 to exit): "; cin >> input; if (input > 0) { cout << "You entered: " << input << endl; } } while (input != 0);
3. 跳转语句
break
:立即终止最内层的switch
、for
、while
或do-while
循环。continue
:跳过当前循环迭代的剩余代码,直接开始下一次循环的条件判断。return
:从当前函数返回。goto
:无条件跳转到同一函数内的标记语句处(慎用,容易使程序流程混乱)。
📋 七、函数 (Functions)
函数是用于执行特定任务的独立代码块,提高代码的复用性和可读性。
1. 函数的定义与调用
// 函数定义
// 返回类型 函数名(参数列表) { 函数体 }
int add(int a, int b) { // a 和 b 是形式参数
int sum = a + b; // 执行计算
return sum; // 使用 return 语句返回值
}
// 函数声明(可在头文件中)
// int add(int a, int b);
int main() {
int result = add(3, 4); // 函数调用,传递参数 3 和 4(实际参数)
cout << result; // 输出: 7
return 0;
}
2. 函数重载 (Function Overloading)
C++ 允许函数重载,即多个函数可以拥有相同的名字,只要它们的参数列表(参数类型、数量或顺序)不同。
void print(int i) {
cout << "整数: " << i << endl;
}
void print(double f) {
cout << "浮点数: " << f << endl;
}
void print(const string& s) {
cout << "字符串: " << s << endl;
}
int main() {
print(10); // 调用 void print(int i)
print(3.14); // 调用 void print(double f)
print("Hello"); // 调用 void print(const string& s)
return 0;
}
3. 默认参数 (Default Arguments)
可以为函数参数指定默认值。调用时如果省略该参数,则使用默认值。默认参数必须从右向左依次指定。
void greet(string name, string greeting = "Hello") {
cout << greeting << ", " << name << "!" << endl;
}
int main() {
greet("Alice"); // 输出: Hello, Alice!
greet("Bob", "Hi"); // 输出: Hi, Bob!
return 0;
}
C++ 的基本语法是构建程序的基石。掌握这些基础后,你将能更好地理解和运用 C++ 的更强大特性,如面向对象编程(类、对象、封装、继承、多态)、标准模板库 (STL)(容器、算法)、指针与内存管理、异常处理等。
学习编程最好的方式就是多动手实践。尝试为每个知识点编写代码,观察结果,并尝试做一些小修改看看会有什么变化。祝你学习愉快!