【Linux C/C++开发】第1章:C/C++基本语法结构
·
第1章:C/C++基本语法结构
🎯 学习目标
完成本章学习后,您将能够:
- ✅ 理解C/C++程序的基本结构和执行流程
- ✅ 掌握预处理指令的使用方法和作用
- ✅ 熟悉C++的命名规则和编码规范
- ✅ 能够编写简单的C/C++程序
- ✅ 理解main函数的重要性和参数含义
📋 本章知识结构
基本语法结构
├── 程序结构基础
│ ├── 预处理指令
│ ├── main函数
│ └── 语句和表达式
├── 注释系统
│ ├── 单行注释
│ ├── 多行注释
│ └── 文档注释
├── 命名规范
│ ├── 标识符规则
│ ├── 命名约定
│ └── 编码风格
└── 编译过程
├── 预处理
├── 编译
├── 汇编
└── 链接
1.1 程序结构基础
1.1.1 最简单的C++程序
让我们从一个最简单的C++程序开始:
#include <iostream> // 预处理指令:引入输入输出流库
int main() // 主函数,程序的入口点
{ // 函数体开始
std::cout << "Hello, World!" << std::endl; // 输出语句
return 0; // 返回值,0表示程序正常结束
} // 函数体结束
程序解析:
#include <iostream>:预处理指令,引入标准输入输出库int main():主函数,程序执行的入口std::cout << "Hello, World!" << std::endl;:输出语句return 0;:返回0表示程序正常结束
1.1.2 预处理指令详解
预处理指令在编译前由预处理器处理,以#开头:
#include <iostream> // 引入标准库头文件
#include <cmath> // 引入数学库
#include "myheader.h" // 引入自定义头文件
#define PI 3.14159 // 定义宏常量
#define MAX(a,b) ((a)>(b)?(a):(b)) // 定义宏函数
#ifdef DEBUG // 条件编译
#define LOG(x) std::cout << x << std::endl
#else
#define LOG(x)
#endif
常见预处理指令:
| 指令 | 作用 | 示例 |
|---|---|---|
#include |
包含头文件 | #include <iostream> |
#define |
定义宏 | #define PI 3.14 |
#ifdef |
条件编译 | #ifdef DEBUG |
#ifndef |
如果未定义 | #ifndef HEADER_H |
#pragma |
编译器指令 | #pragma once |
1.1.3 main函数的多种形态
// 标准形式
int main() {
return 0;
}
// 带参数的形式(命令行参数)
int main(int argc, char* argv[]) {
std::cout << "参数个数: " << argc << std::endl;
for (int i = 0; i < argc; i++) {
std::cout << "参数" << i << ": " << argv[i] << std::endl;
}
return 0;
}
// C++风格参数
int main(int argc, char** argv) {
return 0;
}
参数说明:
argc:argument count,参数个数argv:argument vector,参数数组argv[0]:程序名称argv[1]~argv[argc-1]:实际参数
1.2 注释系统
1.2.1 单行注释
int age = 25; // 这是单行注释,描述变量的用途
// 计算圆的面积
double area = 3.14159 * radius * radius; // 面积公式:πr²
1.2.2 多行注释
/*
* 这是一个多行注释的示例
* 可以用于描述复杂的算法或函数功能
* 注意:注释不能嵌套
*/
int complexCalculation(int x, int y) {
/* 临时变量说明:
result - 存储计算结果
temp - 中间临时值 */
int result = 0;
int temp = x * y; // temp现在保存乘积
return result;
}
1.2.3 文档注释(Doxygen风格)
/**
* @brief 计算两个数的最大公约数
* @param a 第一个正整数
* @param b 第二个正整数
* @return 最大公约数
* @note 使用欧几里得算法
* @warning 参数必须为正整数
*/
int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
1.3 命名规范
1.3.1 标识符规则
// ✅ 合法的标识符
int age;
double _salary;
std::string user_name;
int value123;
// ❌ 非法的标识符
int 123value; // 不能以数字开头
int user-name; // 不能包含减号
int class; // 不能使用C++关键字
int @count; // 不能包含特殊字符
1.3.2 命名约定
// 1. 驼峰命名法(CamelCase)- 推荐用于类名
class StudentManager {
// ...
};
// 2. 蛇形命名法(snake_case)- 推荐用于变量和函数
int student_count;
void calculate_average();
// 3. 匈牙利命名法(不推荐在现代C++中使用)
int iCount; // i表示整数
std::string strName; // str表示字符串
// 4. 常量命名 - 全大写,下划线分隔
const int MAX_SIZE = 100;
const double PI = 3.14159;
1.3.3 现代C++命名最佳实践
namespace math_utils { // 命名空间使用小写+下划线
constexpr double PI = 3.141592653; // 常量使用大写
class Circle { // 类名使用大驼峰
private:
double radius_; // 成员变量使用小写+下划线,末尾加下划线
public:
explicit Circle(double radius) : radius_(radius) {}
double getRadius() const { // 函数名使用小写+下划线
return radius_;
}
double calculateArea() const; // 声明和实现分离
};
}
1.4 编译过程详解
1.4.1 编译的四个阶段
# 完整的编译过程
g++ -E main.cpp -o main.i # 1. 预处理阶段
g++ -S main.i -o main.s # 2. 编译阶段
g++ -c main.s -o main.o # 3. 汇编阶段
g++ main.o -o main # 4. 链接阶段
# 或者直接一步完成
g++ main.cpp -o main
1.4.2 编译过程示意图
main.cpp → 预处理 → main.i → 编译 → main.s → 汇编 → main.o → 链接 → main.exe
↓ ↓ ↓ ↓ ↓ ↓ ↓
源代码 处理宏 汇编代码 机器码 目标文件 可执行文件
1.5 完整示例程序
1.5.1 学生信息管理系统(简化版)
/**
* @file student_system.cpp
* @brief 简单的学生信息管理系统
* @author 学习者
* @date 2025年
*/
#include <iostream>
#include <string>
#include <vector>
// 学生结构体
struct Student {
std::string name; // 学生姓名
int age; // 学生年龄
double gpa; // 平均成绩
};
// 函数声明
void displayWelcome();
void addStudent(std::vector<Student>& students);
void displayStudents(const std::vector<Student>& students);
/**
* @brief 主函数 - 程序入口
*/
int main() {
std::vector<Student> students; // 存储学生信息
int choice; // 用户选择
displayWelcome();
while (true) {
std::cout << "\n=== 学生信息管理系统 ===" << std::endl;
std::cout << "1. 添加学生" << std::endl;
std::cout << "2. 显示所有学生" << std::endl;
std::cout << "3. 退出" << std::endl;
std::cout << "请选择: ";
std::cin >> choice;
switch (choice) {
case 1:
addStudent(students);
break;
case 2:
displayStudents(students);
break;
case 3:
std::cout << "感谢使用!再见!" << std::endl;
return 0;
default:
std::cout << "无效选择,请重试!" << std::endl;
}
}
return 0;
}
/**
* @brief 显示欢迎信息
*/
void displayWelcome() {
std::cout << "欢迎使用学生信息管理系统!" << std::endl;
std::cout << "本系统可以帮助您管理学生信息" << std::endl;
}
/**
* @brief 添加学生信息
* @param students 学生向量引用
*/
void addStudent(std::vector<Student>& students) {
Student new_student;
std::cout << "请输入学生姓名: ";
std::cin >> new_student.name;
std::cout << "请输入学生年龄: ";
std::cin >> new_student.age;
std::cout << "请输入学生GPA: ";
std::cin >> new_student.gpa;
students.push_back(new_student);
std::cout << "学生信息添加成功!" << std::endl;
}
/**
* @brief 显示所有学生信息
* @param students 学生向量(常量引用)
*/
void displayStudents(const std::vector<Student>& students) {
if (students.empty()) {
std::cout << "暂无学生信息!" << std::endl;
return;
}
std::cout << "\n=== 学生信息列表 ===" << std::endl;
for (size_t i = 0; i < students.size(); ++i) {
std::cout << "学生 " << (i + 1) << ": " << std::endl;
std::cout << " 姓名: " << students[i].name << std::endl;
std::cout << " 年龄: " << students[i].age << std::endl;
std::cout << " GPA: " << students[i].gpa << std::endl;
std::cout << std::endl;
}
}
1.6 常见错误与调试技巧
1.6.1 常见编译错误
// ❌ 错误示例
#include <iostream> // 错误1:缺少预处理指令的#号
include <iostream>
int main() {
std::cout << "Hello" << std::endl // 错误2:缺少分号
return 0
} // 错误3:缺少右花括号
1.6.2 调试技巧
#include <iostream>
#define DEBUG // 定义调试宏
int main() {
int x = 10;
int y = 20;
#ifdef DEBUG
std::cout << "调试信息: x = " << x << ", y = " << y << std::endl;
#endif
int sum = x + y;
#ifdef DEBUG
std::cout << "调试信息: sum = " << sum << std::endl;
#endif
std::cout << "结果是: " << sum << std::endl;
return 0;
}
📝 练习题
基础练习
-
编写程序: 创建一个程序,输出个人信息(姓名、年龄、学校)
-
注释练习: 为以下代码添加适当的注释:
#include <iostream> int main() { int a = 5; int b = 3; int c = a + b; std::cout << c << std::endl; return 0; } -
命名规范: 找出以下代码中的命名问题并提出改进建议:
int AGE = 25; double user-salary = 5000.0; int 123count = 0;
进阶练习
- 命令行参数: 编写程序,接收用户姓名作为命令行参数并输出问候语
- 条件编译: 创建一个可以根据DEBUG宏开关调试信息的程序
- 项目结构: 设计一个学生管理系统的文件结构,包含头文件和源文件
📚 参考资料
🔗 相关章节
版本记录:
- v1.0: 2025年 - 基础阶段第1章文档创建
- 更新记录:定期检查并更新内容
本章代码示例:参见 code_examples/ 目录
更多推荐


所有评论(0)