返回 课程

信奥AC之路-1级

0% 完成
0/0 步骤
  1. 第1课 开发环境与基础输出
    5 主题|小节
  2. 第2课 算术运算符
    7 主题|小节
  3. 第3课 printf与运算输出
    7 主题|小节
  4. 第4课 数的进制与拆位
    6 主题|小节
  5. 第5课 变量与基础运算
    17 主题|小节
  6. 第6课 常量与取整运算
    8 主题|小节
  7. 第7课 关系运算
    8 主题|小节
  8. 第8课 逻辑运算
    9 主题|小节
  9. 第9课 输入与计算进阶
    10 主题|小节
  10. 第10课 if语句及双分支语句
    8 主题|小节
  11. 第11课 if语句及双分支进阶
    11 主题|小节
  12. 第12课 三目运算
    9 主题|小节
  13. 第13课 多分支、多if和switch语句
    11 主题|小节
  14. 第14课 循环(基本输出)
    7 主题|小节
  15. 第15课 循环(While+If)
    8 主题|小节
  16. 第16课 循环(计数、求和、求乘积)
    10 主题|小节
  17. 第17课 循环进阶(While+)
    8 主题|小节
  18. 第18课 do-while及while其他用法
    8 主题|小节
  19. 第19课 For循环基础
    9 主题|小节
  20. 第20课 For循环进阶
    8 主题|小节
课 6, 主题|小节 2
进行中

6.1 常量的定义魔法

2025年9月22日
课 进展
0% 完成

“小朋友们,让我们先来认识一下什么是常量。” 我拿起粉笔,在黑板上写道。

6.1.1 使用#define定义常量

// 使用#define预处理指令定义常量
#define PI 3.14159
#define DAYS_PER_WEEK 7
#define HOURS_PER_DAY 24
#define SPEED_OF_LIGHT 300000000
#define EARTH_RADIUS 6371  // 地球半径(千米)

// 使用常量计算
int total_hours = DAYS_PER_WEEK * HOURS_PER_DAY;
double circumference = 2 * PI * EARTH_RADIUS;

[图片:展示#define定义常量的语法和使用方法]

小明举手问道:”小C老师,为什么要用常量呢?直接写数字不行吗?”

“好问题!” 我笑着说,”让我们来看看使用常量的好处:”

  1. 提高代码可读性
  2. 方便统一修改
  3. 避免输入错误
  4. 使程序更专业

[图片:展示使用常量和不使用常量的代码对比]

练习题:

  1. 选择题:下面哪种常量定义是正确的?
    A. #define PI = 3.14159
    B. #define 3.14159 PI
    C. #define PI 3.14159
    D. define PI 3.14159

正确答案:C
解析:#define定义常量的正确格式是”#define 常量名 常量值”,不需要等号,必须以#开头。

  1. 判断题:#define定义的常量可以在程序运行时修改其值。

正确答案:×
解析:#define是预处理指令,在编译前就会进行文本替换,其值不能被修改。

6.1.2 使用const定义常量

“除了#define,我们还有另一种定义常量的魔法!” 我继续讲解道。

// 使用const定义整数常量
const int MAX_SCORE = 100;
const int MIN_SCORE = 0;
const int PASSING_SCORE = 60;

// 使用const定义小数常量
const double PI = 3.14159;
const double GRAVITY = 9.81;

// 同时定义多个相关的常量
const int HOURS = 24;
const int MINUTES = 60;
const int SECONDS = 60;

[图片:展示const和#define的对比]

const和#define的主要区别:

  1. 编译处理阶段
    • #define是预处理器指令,在预处理阶段进行简单的文本替换
    • const是编译器处理的声明,会做类型检查
  2. 内存分配
    • #define定义的常量不分配内存
    • const常量需要分配内存空间
  3. 类型检查
    • #define无类型检查,可能导致错误
    • const有类型检查,更安全
  4. 作用域
    • #define的作用域从定义处到文件结束或#undef
    • const遵循块作用域规则
  5. 调试
    • #define的值在预处理阶段被替换,调试时看不到原名
    • const常量可以在调试时看到名字

[图片:图解const和#define的五个主要区别]

练习题:

  1. 选择题:以下哪种const常量定义是正确的?
    A. const MAX = 100;
    B. const int MAX;
    C. const int MAX = 100;
    D. const 100 = MAX;

正确答案:C
解析:const常量定义时必须指定类型,且必须立即初始化。

  1. 判断题:const定义的常量比#define更节省内存空间。

正确答案:√
解析:const常量只会在内存中存储一份,而#define会在每处使用时进行文本替换。

6.1.3 常量的命名规则

小丽问道:”小C老师,常量的名字要怎么取呢?”

[图片:展示常量命名规则的示例]

  • 基本规则与变量命名相同(字母、数字、下划线组成,首字符不能是数字)
  • 特殊要求:
    • 通常全部大写
    • 多个单词用下划线分隔
    • 名称应当具有描述性
// 推荐的命名方式
#define MAX_SCORE 100        // 使用大写字母
#define SPEED_OF_LIGHT 300000    // 多个词间用下划线连接
#define PI 3.14159          // 简短名称可以直接大写

const int MAX_LENGTH = 1000;     // 使用大写字母
const double GRAVITY = 9.8;      // 物理常量大写
const char* ERROR_MSG = "Error"; // 多词用下划线分隔

// 不推荐的命名方式
#define score 100              // ❌ 不要用小写
#define S 100                  // ❌ 名称太短,含义不明
#define MaxScore 100           // ❌ 不要使用驼峰命名

const int maxSize = 50;        // ❌ 不要用小写或驼峰
const float g = 9.8;           // ❌ 变量名太短,不清晰
const char* errMsg = "Error";  // ❌ 应该全部大写

命名规则总结:

  1. 使用大写字母
  2. 用下划线分隔单词
  3. 名称要有实际含义
  4. 避免过长或过短
  5. 不要以数字开头

[图片:图解常量命名的好坏对比]

练习题:

  1. 选择题:以下哪个常量命名最符合规范?
    A. studentMaxScore
    B. Student_Max_Score
    C. STUDENT_MAX_SCORE
    D. STUDENTMAXSCORE

正确答案:C
解析:常量应该全部大写,多个单词用下划线分隔。

  1. 判断题:常量名可以包含数字,但不能以数字开头。

正确答案:√
解析:和变量命名规则类似,常量名可以包含字母、数字和下划线,但必须以字母或下划线开头。

6.1.4 常量的默认值和类型

“小朋友们,不同类型的常量会有不同的默认值哦!” 我指着黑板说道。

[图片:展示不同类型常量的默认值和存储方式]

// 整数常量
#define INT_CONSTANT 42     // 默认为int类型
#define LONG_CONSTANT 42L   // 指定为long类型
#define MAX_VALUE 2147483647  // int类型的最大值

// 浮点数常量
#define PI 3.14159         // 默认为double类型
#define FLOAT_PI 3.14159F  // 指定为float类型

// 字符常量
#define NEWLINE 'n'       // 字符常量用单引号
#define TAB 't'           // 制表符

[图片:展示不同类型常量的使用场景]

练习题:

  1. 选择题:下列哪个常量定义具有不同的数据类型? A. #define NUM1 42 B. #define NUM2 42L C. #define NUM3 -42 D. #define NUM4 42

正确答案:B 解析:NUM2后面的L表示这是一个long类型的常量,而其他都是默认的int类型。

  1. 判断题:在C++中,3.14和3.14F是相同的数据类型。

正确答案:× 解析:3.14默认为double类型,而3.14F是float类型,它们的精度和存储空间都不同。