Cprogramming 简明教程
C - Constants
constant 中的 C 对于内存中的一个位置给予用户分配的名称,一旦声明之后就不能修改它的值。这就跟 C 中的 variable 相反。 variable 也同样是已命名的内存位置,但是它的值在代码进行过程中可以改变。
为了避免在程序中反复使用硬编码值,建议定义一个常量并使用它。C 程序中的 Constants 通常被用来引用一个值,但是如果这个值在程序中重复使用,同时它的值很可能不会改变,那么就会容易出错。
举例来说,数学常数 PI 的值是一个高精度的浮点数:3.14159265359。如果它很可能频繁出现,就可以将它声明为一个常量并通过它的名称来使用。
我们可以将 C 中的常量看作一个只读变量,因为它的值只能在之后使用,而不能被修改。
你可以使用以下两种方式在 C 程序中声明一个常量:
-
Using the const Keyword
-
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 指令定义的常量实际上没有数据类型。它实际上是在运行时将值替换为宏。