C语言中的常量解释--如何使用#define和const限定词来定义常量

224 阅读4分钟

当你在编程时,有时你会希望某些变量的值保持不变。在C语言中,你可能将它们定义为常量。

你可以用几种不同的方式来定义C语言中的常量。在本教程中,你将学习如何使用#defineconst 修饰符来定义它们。

让我们开始吧:

在C语言中定义常量的常用方法之一是使用#define 预处理器指令,如下图所示。

#define <VAR_NAME> <VALUE>

在上面的语法中:

  • <VAR_NAME> 是常量名称的占位符。
  • 建议你用大写字母命名常量,因为这有助于将它们与程序中定义的其他变量区分开来。
  • <VALUE> 是一个占位符,表示 的值。<VAR_NAME>
  • #define 是一个预处理器指令。
  • 在程序编译之前,预处理器将所有出现的<VAR_NAME> 替换为<VALUE>

在C语言中,预处理器在编译前处理源代码,以产生扩展的源代码。这一点在下文中有所说明。

image-59

C语言预处理程序

在你的程序中,在头文件之后加入所有常量的定义是一个好的做法,如下图所示:

#include <stdio.h>

#define CONSTANT_1 VALUE_1
#define CONSTANT_2 VALUE_2
//

int main()
    {
        //statements here
    }

在下一节,你将看到一个使用#define 来声明C语言常量的例子。

如何使用#define 来声明常量的例子

考虑下面的代码片段,你有两个常量STUDENT_IDCOURSE_CODE

#include <stdio.h>
#define STUDENT_ID 27
#define COURSE_CODE 502

int main()
{
    printf("Student ID: %d is taking the class %d\n", STUDENT_ID,COURSE_CODE);

    return 0;
}


# Output
Student ID: 27 is taking the class 502

在这个例子中:

  • 预处理程序将STUDENT_IDCOURSE_CODE 分别替换为 27 和 502。因此,main() 函数的主体现在将是:
int main()
{
    printf("Student ID: %d is taking the class %d\n", 27, 502);

    return 0;
}
  • 由于printf() 函数可以打印出格式化的字符串,格式指定符%d (用于十进制整数)的两次出现被替换为27和502。

尽管#define 让你定义常量,但你应该注意不要在程序的其他地方重新定义它们。

例如,下面的代码,你已经重新定义了STUDENT_ID 。而且它的编译和执行都不会出错:

#include <stdio.h>
#define STUDENT_ID 27
#define STUDENT_ID 207 //redefinition of a #define constant.
#define COURSE_CODE 502

int main()
{
    printf("Student ID: %d is taking the class %d\n", STUDENT_ID,COURSE_CODE);

    return 0;
}

根据你的编译器,你可能会得到一个警告:你试图重新定义一个已经定义的常量:

image-76

而最新的定义中的值将被使用。

请注意,重新定义的207 的值已经被用作STUDENT_ID ,覆盖了之前定义的值27

image-77

所以你现在知道#define 常数在某种意义上不是真正的常数,因为你可以随时重新定义它们。

继续下一节来学习const 修饰符。

如何使用const 修饰符来定义C语言中的常量

在C语言中,<data_type> <var_name> = <value> 是声明一个类型为<data_type> 的变量<var_name> ,并将其赋值为<value> 的语法。

要使<var_name> 成为一个常量,你只需要在这个语句中添加const 修饰符,如下所示:

const <data_type> <var_name> = <value>;

在变量的定义中加入const 关键字,可以确保其值在程序中保持不变。

const 修饰语使该变量成为只读。 试图在程序的其他地方修改它,在编译过程中会出现错误:

▶进入下一节,使用const 来修改前面的例子。

如何使用const 修饰符来声明常量 示例

在前面的例子中,你有常量STUDENT_IDCOURSE_CODE 。现在你将使用const 修饰符将它们定义为常量:

  • 由于它们都是整数,你可以将它们定义为int 数据类型,取预期值:27502
  • 在各自的定义中包括限定词const

这在下面的代码片断中显示:

#include <stdio.h>

int main()
{
    const int STUDENT_ID = 27;
    const int COURSE_CODE = 502;
    printf("Student ID: %d is taking the class %d\n", STUDENT_ID, COURSE_CODE);

    return 0;
}

# Output
Student ID: 27 is taking the class 502

你可以看到,该代码按预期工作:

在C语言中,你不能重新定义一个已有的变量。

例如,如果int my_var = 2 是第一个定义,如果你试图将my_var 重新定义为int my_var = 3 ,你的程序将不能成功编译。

然而,你总是可以重新分配一个变量的值。

这意味着,如果int my_var = 2 是定义,你可以使用简单的赋值语句为my_var 赋予不同的值,如my_var = 3

现在让我们试着修改一下const 变量STUDENT_ID

#include <stdio.h>

int main()
{
    const int STUDENT_ID = 27;
    STUDENT_ID = 207; // modifying a true constant: NOT POSSIBLE
    const int COURSE_CODE = 502;
    printf("Student ID: %d is taking the class %d\n", STUDENT_ID, COURSE_CODE);

    return 0;
}

你会看到,程序没有编译成功。

而错误信息是:error: assignment of read-only variable 'student_id' ,意思是你只能读取STUDENT_ID 的值,而不能给它赋值。

image-82

因此,const 修饰符渲染了一个真正的常数,它对变化是免疫的,在程序执行过程中不能被改变。

总结

在本教程中,你已经学会了如何定义常数:

  • 使用语法为#define 的预处理器指令#define <VAR_NAME> <VALUE> ,以及
  • 使用const 修饰符,使变量成为只读变量。

希望你觉得这个教程对你有帮助。编码愉快!😄