Cprogramming 简明教程

C - Constants

constant 中的 C 对于内存中的一个位置给予用户分配的名称,一旦声明之后就不能修改它的值。这就跟 C 中的 variable 相反。 variable 也同样是已命名的内存位置,但是它的值在代码进行过程中可以改变。

为了避免在程序中反复使用硬编码值,建议定义一个常量并使用它。C 程序中的 Constants 通常被用来引用一个值,但是如果这个值在程序中重复使用,同时它的值很可能不会改变,那么就会容易出错。

举例来说,数学常数 PI 的值是一个高精度的浮点数:3.14159265359。如果它很可能频繁出现,就可以将它声明为一个常量并通过它的名称来使用。

我们可以将 C 中的常量看作一个只读变量,因为它的值只能在之后使用,而不能被修改。

你可以使用以下两种方式在 C 程序中声明一个常量:

  1. Using the const Keyword

  2. Using the #define Directive

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

Defining a Constant Using the const Keyword

声明常量的语法如下:

const type NAME = val;

例如,

const float PI = 3.14159265359;

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

Example

请看以下示例:

#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 message

error: assignment of read-only variable 'PI'

对于 variables ,你可以在程序中声明一个变量并在之后为它分配一个值,然而对于一个常量你不能遵循相同的方法。

你可以在 C 中声明一个常量而不为它分配一个值。但当你在之后尝试为它分配一个值的时候,编译器就会抛出一个错误。

const float PI;
PI = 3.14159265359;

这里,你将得到以下错误信息:

error: assignment of read-only variable 'PI'

Note : "sizeof" 返回 "size_t"。"size_t" 的无符号整数类型会因平台而异。并且,它可能并非各处的 long 无符号 int。在这些情况下,我们对格式化字符串使用 "%zu" 而不是 "%d"。

这是因为 compiler 在声明时赋值了一个随机垃圾值,之后你不能再改变它。因此,你必须一次性声明并初始化常量。

C 中的 constant 可以是任何 data types ,包括 int、float、char 等基本数据类型,以及 struct 等派生数据类型。

Defining a Constant Using the

使用 #define preprocessor directive 也是定义常量的有效方法。以下是它的 syntax

#define name = value

来看一下以下示例:

#define PI = 3.14159265359

尽管如此定义的常量也可以在任何表达式中使用(就像使用 const 关键字的常量一样),但是有一个 difference between the two

通过 #define 指令创建的常量不受编译器处理。它们的行为像宏,其值在运行时进行替代。

另一个明显的区别是,在使用 #define 指令时,无需提及要赋予常量的值的数据类型。

Example: Define a Constant Using the

下面给出使用 #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 中的一个 identifier ,所以它遵循形成标识符的所有规则。C 中的标识符区分大小写。因此在 C 中定义常量时遵循的惯例是使用大写字符,但这不是强制性的。

Changing the Value of a Constant

根据定义,常量是不变的。你首先会为什么要更改常量?我们使用的是假设要保持不变的常量。为了能够更改值,我们应定义变量而不是常量。

我们已经看到,不可能给已经定义的常量赋予一个新值。但是,存在一种变通方法,可以使用它给常量赋予一个新值。

该技术使用了 pointers in C 的概念。指针是存储另一个变量地址的变量。因为它是一个变量,所以可以更改其值。而且,此更改会反映在原始变量中。

Example: Change the Value of a Constant

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

#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 限定符定义的 constants 有效。

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