信奥崔老师:C++ 程序设计入门

C++ 程序设计入门

欢迎来到C++程序设计入门课程。本章将引导你了解构成C++程序的最基本元素,以及一个程序从代码到可执行文件的完整生命周期。这是你踏入信息学竞赛世界的第一步,掌握这些基础概念至关重要。


1. 程序基本概念

● [1] 标识符、关键字、常量、变量、字符串、表达式的概念

这部分内容是C++语言的"词汇"和"短语"。理解它们,就像学习一门新语言的单词和基本语法。

1. 标识符 (Identifier)
1.1 概念介绍

在程序中,我们需要给各种实体(如变量、函数、类等)命名,以便在代码中引用它们。这种用于命名的有效字符序列就是标识符。简单来说,标识符就是程序员自己起的名字。

1.2 创建步骤
  1. 确定命名对象:想好你要为哪个变量、函数或其他实体命名。
  2. 遵循命名规则
    • 只能由字母(A-Z, a-z)、数字(0-9)和下划线(_) 组成。
    • 第一个字符必须是字母或下划线,不能是数字。
    • 区分大小写 ,例如 myVarmyvar 是两个不同的标识符。
    • 不能是C++的关键字 (如 int, if, for 等)。
  3. 选择有意义的名称 :尽量使用能描述其用途的词语,例如用 student_age 而不是 a 来表示学生的年龄。
1.3 算法可视化SVG图示
** **
1.4 核心特性
  • 唯一性:在同一作用域内,每个标识符必须是唯一的。
  • 描述性:好的标识符能让代码自解释,提高可读性。
  • 区分大小写scoreScore 是两个不同的标识符。
1.5 C++代码基础实现
c 复制代码
#include <iostream>

int main() {
    // 合法的标识符示例
    int studentAge = 20;       // 变量名
    double _score = 95.5;      // 变量名
    int count1 = 100;          // 变量名
    
    // 下面的代码会产生编译错误,因为标识符不合法
    // int 2way = 0;           // 错误:不能以数字开头
    // int class = 5;          // 错误:'class' 是关键字
    
    std::cout << "Student Age: " << studentAge << std::endl;
    return 0;
}
1.6 优化策略(命名规范)
  • 驼峰命名法 (CamelCase) :第一个单词首字母小写,之后每个单词首字母大写。如 myVariableName
  • 帕斯卡命名法 (PascalCase) :所有单词首字母都大写。常用于类名。如 MyClassName
  • 下划线命名法 (snake_case) :单词之间用下划线分隔。如 my_variable_name
  • 在竞赛中,为了速度,有时会使用简短的命名(如 i, j, n, k),但对于复杂问题,推荐使用有意义的命名。
1.7 优缺点
  • 优点
    • 提高了代码的可读性和可维护性。
    • 允许程序员抽象和组织代码。
  • 缺点
    • 命名不当会严重降低代码可读性,甚至误导读者。
    • 过长的命名会增加代码量。
1.8 应用场景
  • 定义变量名、常量名。
  • 定义函数名、类名、结构体名。
  • 定义命名空间。
1.9 扩展
  • 作用域 (Scope):标识符的有效范围。可以是全局的(整个程序),也可以是局部的(某个函数或代码块内)。
  • 保留标识符:以下划线开头后接大写字母,或包含双下划线的标识符,通常被编译器和标准库保留,应避免使用。
1.10 课后配套练习
  1. 题目 :判断下列哪些是合法的C++标识符:a, _a, a_1, 1_a, for, A, a-b, a b

    • 答案 :合法的有 a, _a, a_1, A
  2. 题目:定义一个整型变量来存储苹果的数量,并给它赋一个初始值10。

    • C++代码实现

      ini 复制代码
      int appleCount = 10;
  3. 题目:用驼峰命名法定义一个变量,表示一个学生的平均分。

    • C++代码实现

      arduino 复制代码
      double studentAverageScore;
  4. 题目:用下划线命名法定义一个常量,表示圆周率。

    • C++代码实现

      ini 复制代码
      const double PI_VALUE = 3.14159;
  5. 题目:下面的代码有什么错误?请修正它。

    ini 复制代码
    int my age = 15;
    • 答案 :标识符 my age 包含空格,是非法的。应改为 my_agemyAge

      ini 复制代码
      int myAge = 15; // 或者 int my_age = 15;

2. 关键字 (Keyword)
2.1 概念介绍

关键字 是C++语言预先定义好的、具有特殊含义的单词。这些词被C++编译器"保留"了,不能用作标识符。例如 int 用来表示整数类型,if 用来表示条件判断。

2.2 逻辑步骤
  1. 学习和记忆 :熟悉常用的C++关键字(如 int, double, if, else, for, while, return, class 等)。
  2. 识别:在编写代码时,现代的IDE(集成开发环境)通常会用不同的颜色高亮显示关键字。
  3. 规避:在为变量、函数等命名时,确保不使用任何关键字。
2.3 算法可视化SVG图示
** **
2.4 核心特性
  • 预定义:由C++语言标准定义。
  • 有特殊意义:每个关键字都有其特定的语法功能。
  • 全部小写:C++的关键字都是小写的。
  • 保留:不能用作标识符。
2.5 C++代码基础实现
c 复制代码
#include <iostream>

int main() {
    // 'int' 是关键字,用于声明一个整型变量
    int number = 10;
    
    // 'if' 和 'else' 是关键字,用于条件控制
    if (number > 5) {
        std::cout << "Number is greater than 5." << std::endl;
    } else {
        std::cout << "Number is not greater than 5." << std::endl;
    }
    
    // 'for' 是关键字,用于循环
    for (int i = 0; i < 3; ++i) {
        std::cout << "Loop iteration: " << i << std::endl;
    }
    
    // 'return' 是关键字,用于从函数返回值
    return 0;
}
2.6 优化策略/最佳实践
  • 利用IDE:好的代码编辑器会自动高亮关键字,帮助你识别它们。
  • 不尝试"绕过" :不要试图使用类似关键字的标识符(如 _int),这会降低代码可读性。
  • 查阅资料:如果不确定一个词是否是关键字,可以查阅C++关键字列表。
2.7 优缺点
  • 优点
    • 提供了语言的结构和语法骨架。
    • 使编译器能够理解代码的意图。
  • 缺点
    • 限制了可用的标识符名称。
2.8 应用场景
  • 数据类型定义int, double, char, bool, struct, class
  • 流程控制if, else, for, while, do, switch, case, break, continue
  • 函数相关void, return, inline
  • 访问控制public, private, protected
2.9 扩展
  • C++11及以后的新关键字 :现代C++引入了更多关键字,如 auto, nullptr, decltype, constexpr 等,它们提供了更强大的功能。
  • 上下文关键字 :如 overridefinal,它们只在特定的上下文中才被视为关键字。
2.10 课后配套练习
  1. 题目:列出你所知道的至少5个C++关键字。

    • 答案int, double, if, for, while, return, void等。
  2. 题目 :为什么 int char = 'a'; 这行代码是错误的?

    • 答案 :因为 char 是一个关键字,不能用作标识符(变量名)。
  3. 题目 :用 for 关键字编写一个从1打印到5的循环。

    • C++代码实现

      c 复制代码
      #include <iostream>
      int main() {
          for (int i = 1; i <= 5; ++i) {
              std::cout << i << " ";
          }
          std::cout << std::endl;
          return 0;
      }
  4. 题目main 是不是关键字?

    • 答案 :不是。main 是一个特殊的函数名,作为程序的入口,但它不是语言的保留关键字。你可以定义一个名为 main 的变量(虽然极不推荐)。
  5. 题目 :使用 ifelse 关键字,判断一个数是奇数还是偶数。

    • C++代码实现

      c 复制代码
      #include <iostream>
      int main() {
          int num = 10;
          if (num % 2 == 0) {
              std::cout << num << " is even." << std::endl;
          } else {
              std::cout << num << " is odd." << std::endl;
          }
          return 0;
      }

3. 常量 (Constant) 与 变量 (Variable)
3.1 概念介绍
  • 变量 (Variable) :是程序中用于存储数据的一块内存空间,其存储的值在程序运行过程中可以改变 。变量有三个要素:类型名称 (标识符)和
  • 常量 (Constant) :也是用于存储数据的内存空间,但其值在定义后就不能被修改。常量用于表示固定的值,如圆周率π、一年的天数等。
3.2 算法步骤(定义和使用)

定义变量

  1. 指定类型 :确定要存储的数据类型(如 int 表示整数,double 表示小数)。
  2. 指定名称:为变量起一个合法的标识符。
  3. (可选)初始化:在定义时赋一个初始值。
    • 类型 变量名; (仅声明)
    • 类型 变量名 = 初始值; (声明并初始化)

定义常量

  1. 使用 const 关键字 :在变量定义前加上 const
  2. 必须初始化:常量在定义时必须被赋予一个初始值。
    • const 类型 常量名 = 值;
**3.3 算法可视化SVG图示 **
****
  • 图示说明 :左侧的变量 score 像一个普通的盒子,里面的值可以从90更新为100。右侧的常量 PI 像一个被锁定的盒子,它的值3.14不能被改变。
2.4 核心特性
  • 变量
    • 可变性:值可以在运行时被程序修改。
    • 必须先定义后使用:编译器需要知道变量的类型和名称。
  • 常量
    • 不可变性:一旦初始化,其值就不能再更改。
    • 安全性:防止意外修改重要数据。
    • 可读性 :使用有意义的常量名(如 MAX_USERS)比直接使用数字(如 100)更易于理解。
2.5 C++代码基础实现
c 复制代码
#include <iostream>

// 使用 #define 定义常量(C风格,不推荐在C++中常用)
#define DAYS_IN_WEEK 7

int main() {
    // ---- 变量 ----
    int score = 90; // 定义并初始化一个整型变量
    std::cout << "Initial score: " << score << std::endl;
    
    score = 95; // 修改变量的值
    std::cout << "Updated score: " << score << std::endl;
    
    // ---- 常量 ----
    // 使用 const 关键字定义常量(推荐方式)
    const double PI = 3.14159; 
    std::cout << "Value of PI: " << PI << std::endl;
    
    // 下面的代码会产生编译错误,因为常量的值不能被修改
    // PI = 3.14; 
    
    std::cout << "Days in a week: " << DAYS_IN_WEEK << std::endl;

    return 0;
}
2.6 优化策略
  • 就近声明:在第一次使用变量之前再声明它,可以缩小其作用域。
  • 总是初始化:声明变量时立即给它一个初始值,避免使用未定义的"垃圾值"。
  • 优先使用 const :如果一个值不应该被改变,就把它声明为 const。这能让编译器帮你检查错误,也使代码意图更清晰。
  • 常量命名 :通常使用全大写加下划线的方式命名常量,如 MAX_SIZE,以示区分。
2.7 优缺点
  • 变量
    • 优点:灵活,是程序动态性的基础。
    • 缺点:容易被意外修改,导致程序错误(bug)。
  • 常量
    • 优点:增强了程序的健壮性和可读性,便于维护(只需修改一处定义)。
    • 缺点:缺乏灵活性。
2.8 应用场景
  • 变量
    • 存储用户输入。
    • 循环计数器。
    • 保存计算的中间结果或最终结果。
  • 常量
    • 数学或物理常数(π,e,重力加速度 g)。
    • 程序配置(数组最大大小,窗口宽度,最大尝试次数)。
    • 固定的状态值。
2.9 扩展
  • constexpr:C++11引入的关键字,用于定义"编译时常量"。编译器在编译程序时就能确定其值,可以用于更高级的优化。
  • 枚举 (enum):一种创建一组相关命名常量的方式,例如表示星期几或颜色。
2.10 课后配套练习
  1. 题目 :声明一个名为 height 的双精度浮点型变量,并初始化为1.75。

    • C++代码实现

      ini 复制代码
      double height = 1.75;
  2. 题目 :定义一个名为 SECONDS_PER_MINUTE 的整型常量,值为60。

    • C++代码实现

      ini 复制代码
      const int SECONDS_PER_MINUTE = 60;
  3. 题目:尝试修改上题中定义的常量的值,看看编译器会报什么错。

    • C++代码实现

      ini 复制代码
      const int SECONDS_PER_MINUTE = 60;
      SECONDS_PER_MINUTE = 61; // 这行会报错
    • 可能的错误信息error: assignment of read-only variable 'SECONDS_PER_MINUTE'

  4. 题目 :交换两个整型变量 ab 的值。

    • C++代码实现

      c 复制代码
      #include <iostream>
      int main() {
          int a = 5, b = 10;
          std::cout << "Before swap: a = " << a << ", b = " << b << std::endl;
          int temp = a; // 使用一个临时变量
          a = b;
          b = temp;
          std::cout << "After swap: a = " << a << ", b = " << b << std::endl;
          return 0;
      }
  5. 题目:一个程序需要一个数组来存储最多100个学生的分数。你应该用变量还是常量来定义这个大小?为什么?请写出定义。

    • 答案:应该用常量。因为数组大小在编译时需要确定,并且这个"100"是一个固定的限制,不应在程序运行时被修改。使用常量使得代码更清晰且易于维护。

    • C++代码实现

      ini 复制代码
      const int MAX_STUDENTS = 100;
      double scores[MAX_STUDENTS];

相关推荐
Q741_1473 小时前
C++ 位运算 高频面试考点 力扣 面试题 17.19. 消失的两个数字 题解 每日一题
c++·算法·leetcode·面试·位运算
Jacob00003 小时前
[Decision Tree] H(D) & IG & IGR
算法·面试
vadvascascass3 小时前
平滑加权轮询负载均衡的底层逻辑
java·算法·负载均衡
CoovallyAIHub3 小时前
Transformer作者开源进化计算新框架,样本效率暴增数十倍!
深度学习·算法·计算机视觉
晓宜4 小时前
Java25 新特性介绍
java·python·算法
琼羽1094 小时前
第十七周-通用量子门与Deutsch-Jozsa算法
算法·量子计算
旺小仔.4 小时前
位运算专题
算法
xwl12125 小时前
10.6 作业
数据结构·算法
胡小禾7 小时前
JDK17和JDK8的 G1
jvm·算法