const變數與巨集的區別

2021-06-08 06:54:49 字數 2486 閱讀 7579

const的用法有四種:引數、返回值、函式,?另一種沒有想起來

用const修飾變數將限定變數為唯讀,該變數值不允許被改變。下面是const用於定義陣列大小的乙個簡單例子:

const int arraysize = 10;

int array[arraysize];//僅限於c++可以這樣表示。

const變數必須初始化,這個一次性的初始化是設定其數值的唯一機會。

const int i; //錯誤,沒有初始化

const也可以用於修飾指標。例如:

char cha = 'a';

const char chb = 'b';

char *const ptr_1 = &cha;  //常指標

const char *ptr_2 = &chb;  //指向常量的指標

char const *ptr_3 = &chb;  //指向常量的指標

const char *const ptr_4 = &chb; //指向常量的常指標  

當const與*並存時,正確區分的原則是:如果const位於*後,則指標本身是不能被修改的(常指標),至於指標所指向的變數,則可能允許被修改;如果const位於*前,則指標所指向的變數不能被修改的,即該指標是指向常量的指標,至於指標本身,則可能允許修改。而const與型別標識的位置關係則無關緊要,所以ptr_2和ptr_3是一樣的。依據這一原則,很容易判斷出下面的操作是否合法。

ptr_1 = &chb; //錯誤

*ptr_1 = chb; //正確

ptr_2 = &cha; //正確

*ptr_3 = cha; //錯誤

ptr_4 = &cha; //錯誤

*ptr_4 = cha; //錯誤

const也可以用於修飾引用,但不能用引用改變所指const變數的值。const定義常量物件的引用,可以用常量初始化,也可以用變數初始化。如果用變數初始化,則引用成為該變數的唯讀別名。也可以用常量表示式初始化const引用,但不可以用常量表示式初始化變數的引用。

const int i = 1;

int j = 2;

const int &m = i;

const int &n = j;

int &k = i + j;  //錯誤

const int &p = i + j; //正確

定義本身為常量的引用變數是無意義的(雖然合法),因為所有引用變數自動成為常量(因為一量引用初始化,就不能引用其他變數)。

int n;

int &const k = n; //合法但沒有意義

#include "stdio.h"

#define str1 "this is the first string!\n"

void main(void)

所以使用const還可以節省記憶體空間。

#define t 13                         /*用#define定義的乙個常量t*/

int main()

區別:const常量有資料型別, 而巨集常量沒有資料型別。編譯器可以對前者進行型別安全檢查,而對後者只能進行字元替換,沒有型別

 安全檢查。而且字元替換可能會帶來料想不到的邊界效應。

 有些整合化工具可以對const常量進行除錯, 但不能對巨集量進行除錯。

1.差別:const與#define最大的差別在於:前者在堆疊分配了空間,而後者只是把具體數值直接傳遞到目標變數罷了,#define不占用記憶體單元,每次呼叫都會分配記憶體。

或者說,const的常量是乙個run-time的概念,他在程式中確確實實的存在可以被呼叫、傳遞。而#define常量則是乙個compile-time概念,它的生命週期止於編譯期:在實際程式中他只是乙個常數、乙個命令中的引數,沒有實際的存在。const常量存在於程式的資料段.#define常量存在於程式的**段。

2優缺點:至於兩者的優缺點,要看具體的情況了。

從執行效率上來說#define是乙個更好的選擇:

i.從run-time的角度來看,他在空間上和時間上都有很好優勢。

ii.從compile-time的角度來看,類似m=t*10的**不會被編譯器優化,t*10的操作需要在run-time執行。而#define的常量會被合併。但是:如果你需要粗魯的修改常數的值,那就的使用const了,因為後者在程式中沒有實際的存在.另外在標頭檔案中使用 #define 可以避免標頭檔案重複包含的問題,這個功能,是const無法取代的

從執行穩健性來說用const會好一些:

在c語言中,還有用於定義常數的巨集#define,它做是值代替(即文字代替),沒有型別檢查工具。而const提供了型別檢查,可以避免值代替時容易出現的一些問題。安全檢查。而且字元替換可能會帶來料想不到的邊界效應。 有些整合化工具可以對const常量進行除錯, 但不能對巨集量進行除錯。所以c++中我們一般提倡用const,c語言就看情況使用了。

const常量與巨集定義區別

1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...

const常量與巨集定義區別

1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行型別檢查。3 儲存方式不同 define巨集僅僅是展開,有多少地方使用,就展開多少...

巨集定義 define 與 const的區別

define radius 100 const float radius 100 1 編譯器處理方式不同 define巨集是在預處理階段展開。const常量是編譯執行階段使用。2 型別和安全檢查不同 define巨集沒有型別,不做任何型別檢查,僅僅是展開。const常量有具體的型別,在編譯階段會執行...