C - 常量



C 语言中,常量是指分配给内存中某个位置的用户自定义名称,其值一旦声明后便无法修改。这与 C 语言中的变量形成对比,变量也是一个命名内存位置,但其值在代码执行过程中可以更改。

建议在程序中定义一个常量并使用它,而不是重复使用硬编码值。C 程序中的常量通常用于引用一个值,如果该值在程序中重复使用,则可能容易出错,同时其值不太可能发生变化。

例如,数学常数 PI 的值为一个高精度浮点数 3.14159265359,如果它可能频繁出现,则将其声明为常量并使用其名称。

我们可以将 C 语言中的常量视为只读变量,因为它的值只能随后使用,而不能修改。

您可以通过以下两种方式之一在 C 程序中声明常量:

  • 使用 const 关键字

  • 使用 #define 指令

让我们了解一下在 C 语言中声明常量的这两种方法。

使用 const 关键字定义常量

声明常量的语法如下:

const type NAME = val;

例如:

const float PI = 3.14159265359;

现在,我们可以在任何表达式中使用 PI,就像使用任何变量一样。

示例

请看下面的示例:

#include <stdio.h>

int main(){
   const float PI = 3.14159265359;
   float radius = 5;
   float area = PI*radius*radius;
   printf ("area: %f", area);
   return 0;
}

输出

运行此代码后,您将获得以下输出:

area: 78.539818

但是,禁止更改常量的值。以下语句会导致编译器错误:

const float PI = 3.14159265359;
PI=22/7;

在这里,您将收到以下错误消息

error: assignment of read-only variable 'PI'

对于 变量,您可以声明一个变量并在程序后面的某个位置为其赋值,但是对于常量,您不能使用相同的流程。

您可以在 C 语言中声明一个常量而不为其赋值。但是,当您尝试在之后为其赋值时,编译器会抛出错误。

const float PI;
PI = 3.14159265359;

在这里,您将收到此错误消息:

error: assignment of read-only variable 'PI'

注意:“sizeof” 返回 “size_t”。“size_t” 的无符号整数类型可能会因平台而异。并且,它可能并非在所有地方都是 long unsigned int。在这种情况下,我们使用“%zu” 作为格式字符串而不是“%d”。

这是因为 编译器 在声明时分配了一个随机的垃圾值,您之后无法更改该值。因此,您必须同时声明和初始化常量。

C 语言中的常量可以是任何 数据类型,包括基本数据类型(如 int、float、char)和派生数据类型(如 struct)。

使用 #define 指令定义常量

使用#define 预处理器指令 也是定义常量的一种有效方法。以下是其语法

#define name = value

请看下面的示例

#define PI = 3.14159265359

尽管如此定义的常量也可以在任何表达式中使用(就像使用 const 关键字定义的常量一样),但两者之间存在差异

#define 指令创建的常量不由编译器处理。相反,它们的行为类似于宏,其值在运行时被替换。

另一个值得注意的差异是,使用#define 指令时,您无需提及要分配给常量的值的类型。

示例:使用 #define 定义常量

下面是另一个使用 #define 指令定义常量的示例:

#include <stdio.h>
#define LENGTH 10   
#define WIDTH  5
#define NEWLINE '\n'

int main() {
   int area;  
   area = LENGTH * WIDTH;
   printf("length: %d width: %d", LENGTH, WIDTH);
   printf("%c", NEWLINE);
   printf("value of area : %d", area);
   return 0;
}

输出

运行此代码后,您将获得以下输出:

length: 10 width: 5
value of area : 50

由于常量也是 C 语言中的 标识符,因此它遵循形成标识符的所有规则。C 语言中的标识符区分大小写。因此,在 C 语言中定义常量时遵循的约定是使用大写字符,但这并非强制性。

更改常量的值

根据定义,常量是不可变的。为什么要在首先更改常量的值?我们使用常量是为了保持其值不变。为了能够更改值,我们将定义一个变量而不是常量。

我们已经看到,无法为已定义的常量分配新值。但是,存在一种变通方法,可以通过该方法为常量分配新值。

该技术利用了 C 语言中指针 的概念。指针是一个存储另一个变量地址的变量。由于它是一个变量,因此可以更改其值。此外,此更改会反映在原始变量中。

示例:更改常量的值

以下代码演示了如何使用指针机制更改常量的值:

#include <stdio.h>
int main(){
   const int x = 10;
   printf("Initial Value of Constant: %d\n", x);

   // y is a pointer to constant x
   int* y = &x;
   
   // assign new value
   *y = 100;
   printf("Value of Constant after change: %d", x);
   return 0;
}

输出

执行此代码后,您将获得以下输出:

Initial Value of Constant: 10
Value of Constant after change: 100

请注意,此技术仅适用于使用const限定符定义的常量

如果您使用#define 指令定义了常量,则无法应用此过程。这是因为指针具有数据类型,并且必须与要存储其地址的类型相同。另一方面,使用#define 指令定义的常量实际上没有数据类型。它实际上是一个在运行时被替换的宏。

广告