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 指令定義的常量實際上沒有資料型別。它實際上是一個在執行時被替換的宏。

廣告