01_第一章_数据类型_03_常量

本文介绍了C语言中的常量,包括整型、实型、字符型、字符串和枚举类型的常量,强调了避免使用幻数的必要性,并详细讲解了宏常量的概念、宏定义、宏展开与替换,以及宏常量存在的问题。同时,文章讨论了常量的定义格式和优势,指出常量在提高代码可读性和维护性方面的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常量

常量的概念和类型

常量的概念

常量就是在程序中不能改变其值的量

常量的类型
整型
  1. 整型常量默认为int类型
  2. 例如:10就代表一个int类型的十进制常量
  3. 012这样的以0开头的表示一个int类型的八进制常量
  4. 0x120x开头就表示这是一个int类型的十六进制常量
  5. 由于整型常量默认为int类型,所以如果想要表示一个long类型的常量,就需要在一个整型常熟后面加上l或者L表示这是一个long类型的常量
  6. u作为后缀,表示这个整数是无符号int类型
实型
  1. 实型长常量默认为double类型
  2. 可以用小数形式或者是科学计数法的形式表示(例如3.14, 1.2e-5)
  3. 要表示一个实数属于float类型,必须在一个实数后面加上f或者F(例如3.14F)
  4. 而要表示一个long double类型,则应该在一个实数后面加上一个L作为后缀
字符型

使用一对单引号(’’)引起来的一个字符,就表示这是一个字符型常量

字符串

一堆双引号("")括起来的内容,就是一个字符串常量

枚举类型

幻数(Magic Number)

幻数的概念

在程序中直接使用的常数,也就是一个字面量常量,这样的数称为幻数.例如

#include <stdio.h>

int main(void)
{
    double area = 3.14 * 2 * 2;
    printf("%d\n", area);
    
    return 0;
}
  • 上面例子中的3.14等常数就称为幻数
使用幻数存在的问题
  1. 程序的可读性差
  2. 容易发生书写错误,产生不一致
  3. 后期代码维护难度大
如何在程序中避免使用幻数
  1. 良好的程序设计风格应该把幻数定义为:
    • 宏常量
    • const常量
  2. 将幻数定义为一个宏常量或者是const常量的好处就是
    • 能够减少重复书写常数的工作量,从而也能减少书写常数出错的可能性
    • 提高了代码的可读性和可维护性

宏常量

宏常量的概念

使用一个标识符号来标识的常量

宏定义
#define 标识符 需要进行标识的字符串
  • 其中#符号表示这是一条编译预处理指令
  • 编译预处理指令表示这一条指令是在源代码被编译前就已经先被编译预处理程序进行处理过,然后将处理的结果和源代码一起进行编译最终获得目标代码
  • 标识符为符号常量,也成为宏名, 一般全大写
  • 需要进行标识的字符串就是要使用标识符进行标识的字符串,定义了一个宏之后,就可以在源代码中使用宏名代替需要进行标识的字符串
宏展开、宏替换
  1. 定义了一个宏之后,我们就可以在源代码中使用宏名来代替其标识的字符串

  2. 在预编译的时候,预编译处理程序会将源程序中所有使用了宏名的地方展开和替换为其代表的字符。例如

    #include <stdio.h>
    #define PI 3.14
    
    int main(void)
    {
        double area = PI * 2 * 2;
        printf("%d\n", area);
        
        return 0;
    }
    
    • 预编译处理之后,展开为

      #include <stdio.h>
      #define PI 3.14
      
      int main(void)
      {
          double area = 3.14 * 2 * 2;
          printf("%d\n", area);
          
          return 0;
      }
      
  3. 所以我们在宏定义的时候,末尾一般不要写;号,因为这并不是一条c语句

  4. 宏替换实际上就是一个完完全全的纯文本替换,在进行预编译处理的时候,将宏名替换为它所 代表的字符串。如果我们像下面这样写

    #define PI 3.14;
    
    ...
        
    double area = PI * 2 * 2;
    
    • 那替换后就变成了

      #define PI 3.14;
      
      ...
          
      double area = 3.14; * 2 * 2;
      
    • 这样就会导致产生编译错误

  5. 我们知道,双引号("")之间包含的内容是一个字符串常量,因此,对于字符串常量中出现的宏名,是不会进行宏展开和宏替换的。例如

#define PI 3.14
...
printf("PI = %f\n", PI);
  • 那么字符串常量中的PI是不会被进行宏展开和宏替换的。其宏替换结果为
#define PI 3.14
...
printf("PI = %f\n", 3.14);
宏常量存在的问题
  1. 没有数据类型,进行宏替换的时候不进行类型检查
  2. 宏替换就是简单的纯文本替换,容易产生意想不到的错误

const常量

const常量的定义格式
const DataType valueName = value;
  • 这和变量的定义类似,前面用const来修饰,同时还必须在定义的时候给该const常量赋初值,因为这是定义一个常量,而常量是存储在只读区域的,因此必须在定义的同时赋初值
const常量的优势

const常量具有数据类型,编译器能够对其类型进行检查


END

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值