第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表示程序正常结束
}                   // 函数体结束

程序解析

  1. #include <iostream>:预处理指令,引入标准输入输出库
  2. int main():主函数,程序执行的入口
  3. std::cout << "Hello, World!" << std::endl;:输出语句
  4. 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;
}

📝 练习题

基础练习

  1. 编写程序: 创建一个程序,输出个人信息(姓名、年龄、学校)

  2. 注释练习: 为以下代码添加适当的注释:

    #include <iostream>
    int main() {
        int a = 5;
        int b = 3;
        int c = a + b;
        std::cout << c << std::endl;
        return 0;
    }
    
  3. 命名规范: 找出以下代码中的命名问题并提出改进建议:

    int AGE = 25;
    double user-salary = 5000.0;
    int 123count = 0;
    

进阶练习

  1. 命令行参数: 编写程序,接收用户姓名作为命令行参数并输出问候语
  2. 条件编译: 创建一个可以根据DEBUG宏开关调试信息的程序
  3. 项目结构: 设计一个学生管理系统的文件结构,包含头文件和源文件

📚 参考资料

🔗 相关章节


版本记录:

  • v1.0: 2025年 - 基础阶段第1章文档创建
  • 更新记录:定期检查并更新内容

本章代码示例:参见 code_examples/ 目录

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐