日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

C语言 const 和 define 区别 - C语言零基础入门教程

發布時間:2024/9/27 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C语言 const 和 define 区别 - C语言零基础入门教程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

目錄

  • 一.const 使用
    • 1.const 修飾變量
    • 2.const 修飾指針
    • 3.const 修飾在函數名前面
    • 4.const 修飾在函數名后面
    • 5.const 修飾函數參數
  • 二.define 使用
    • 1.define 定義常量
    • 2.define 定義函數
    • 3.define 定義多行函數
    • 4.define 防止頭文件重復包含
  • 三.const 和 define 區別
    • 1.就起作用的階段而言
    • 2.就起作用的方式而言
    • 3.就存儲方式而言
    • 4.從代碼調試的方便程度而言
    • 5.從效率程度而言
  • 四.const 優點
  • 五.猜你喜歡

零基礎 C/C++ 學習路線推薦 : C/C++ 學習目錄 >> C 語言基礎入門

一.const 使用

const 是 constant 的縮寫,“恒定不變”的意思。被 const 修飾的東西都受到強制保護,可以預防意外的變動,能提高程序的健壯性。所以很多 C++ 程序設計書籍建議:“Use const whenever you need”。

1.const 修飾變量

/******************************************************************************************/ //@Author:猿說編程 //@Blog(個人博客地址): www.codersrc.com //@File:C語言 const 和 define 區別 //@Time:2021/07/04 08:00 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累! /******************************************************************************************/#include <stdio.h>int main() {const int a = 20 ;printf("a = %d\n",a);a = 200 ;printf("a = %d\n",a);return 0; }/*輸出:Compilation Failederror: assignment of read-only variable 'a'6 | a = 200 ;| ~~^~~~~*/

用 const 定義的變量的值是不允許改變的,即不允許給它重新賦值,即使是賦相同的值也不可以。并且 const 修飾的變量在定義的時候就給它賦初值,否則報錯:

error: uninitialized 'const ' [-fpermissive]

詳細解釋可以直接跳轉:const 修飾變量

2.const 修飾指針

//以下兩者等價,表示 *p 不可變。*p 表示的是指針變量 p 所指向的內存單元里面的內容,此時這個內容不可變; const int *p int const *p//此時 const 修飾的是 p,所以 p 中存放的內存單元的地址不可變,而內存單元中的內容可變。即 p 的指向不可變,p 所指向的內存單元的內容可變; int * const p//*p 和 p 都被修飾了,那么 p 中存放的內存單元的地址和內存單元中的內容都不可變; const int * const p

詳細解釋可以直接跳轉:const修飾指針

3.const 修飾在函數名前面

當 const 在函數名前面的時候修飾的是函數返回值;在函數名后面表示是 C++ 常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。

const char * GetString(void); const int GetInt(void); const float GetFloat(void); const double GetDdouble(void);

如果給以“指針傳遞”方式的函數返回值加 const 修飾,那么函數返回值(即指針)的內容不能被修改,該返回值只能被賦給加 const 修飾的同類型指針;

const char * GetString(void);//如下語句將出現編譯錯誤: //char *str = GetString();//正確的用法是 const char *str = GetString();

如果函數返回值采用“值傳遞方式”,由于函數會把返回值復制到外部臨時的存儲單元中,加 const 修飾沒有任何價值。

int GetInt(void);const int GetInt(void);

以上兩個函數都是都是獨立存在的,并非同一個函數;

4.const 修飾在函數名后面

當 const 在函數名前面的時候修飾的是函數返回值;在函數名后面表示是 C++ 常成員函數,該函數不能修改對象內的任何成員,只能發生讀操作,不能發生寫操作。

/******************************************************************************************/ //@Author:猿說編程 //@Blog(個人博客地址): www.codersrc.com //@File:C語言 const 和 define 區別 //@Time:2021/07/04 08:00 //@Motto:不積跬步無以至千里,不積小流無以成江海,程序人生的精彩需要堅持不懈地積累! /******************************************************************************************/class People {public:int talk(void);int eat(void) const; // const 成員函數private:int m_age;}; int People::eat(void) const {++m_age; // 編譯錯誤,企圖修改數據成員m_numtalk(); // 編譯錯誤,企圖調用非const函數return m_age; }
  • const 對象只能訪問 const 成員函數,而非 const 對象可以訪問任意的成員函數,包括 const 成員函數;
  • const 對象的成員是不可修改的,然而 const 對象通過指針維護的對象卻是可以修改的;
  • const 成員函數不可以修改對象的數據,不管對象是否具有 const 性質.它在編譯時,以是否修改成員數據為依據,進行檢查;
  • 然而加上 mutable 修飾符的數據成員,對于任何情況下通過任何手段都可修改,自然此時的 const 成員函數是可以修改它的;

5.const 修飾函數參數

如果函數參數采用“指針傳遞”,那么加 const 修飾可以防止意外地改動該指針,起到保護作用。

void StringCopy (char*strDestination, const char *strSource);

其中 strSource 是輸入參數,strDestination 是輸出參數。給 strSource 加上 const 修飾后,如果函數體內的語句試圖改動 strSource 的內容,編譯器將指出錯誤。

如果輸入參數采用“值傳遞”,由于函數將自動產生臨時變量用于復制該參數,該輸入參數本來就無需保護,所以不要加 const 修飾。

例如不要將函數 void Func1(int x) 寫成 void Func1(const int x)。

如果參數作為輸出參數,不論它是什么數據類型,也不論它采用“指針傳遞”還是“引用傳遞”,都不能加 const 修飾,否則該參數將失去輸出功能(因為有 const 修飾之后,不能改變他的值)。

如果參數作為輸入參數,可以防止數據被改變,起到保護作用,增加程序的健壯性;

二.define 使用

1.define 定義常量

C 語言中,可以用 #define 定義一個標識符來表示一個常量,用 #define 定義標識符的一般形式為:

#define 標識符 常量 //注意define最后沒有分號 //例如: #define MAX_VALUE 100 //定義整型變量MAX_VALUE值為100 #define USER_NAME "huge" //定義字符串變量USER_NAME值為"huge" #define PI 3.1415926 //定義浮點數變量PI值為3.1415926

凡是以 # 開頭的均為預處理指令,預處理又叫預編譯。預編譯不是編譯,而是編譯前的處理。這個操作是在正式編譯之前由系統自動完成的。

2.define 定義函數

//定義常量 #define MAX_VALUE 100 //定義整型變量MAX_VALUE值為100 #define USER_NAME "huge" //定義字符串變量USER_NAME值為"huge" #define PI 3.1415926 //定義浮點數變量PI值為3.1415926//定義函數 #define MAX(a,b) (a>b)?a:b //取兩個數最大值 #define MIN(a,b) (a<b)?a:b //取兩個數最小值

3.define 定義多行函數

//定義常量 #define MAX_VALUE 100 //定義整型變量MAX_VALUE值為100 #define USER_NAME "huge" //定義字符串變量USER_NAME值為"huge" #define PI 3.1415926 //定義浮點數變量PI值為3.1415926//定義簡單函數 #define MAX(a,b) (a>b)?a:b //取兩個數最大值 #define MIN(a,b) (a<b)?a:b //取兩個數最小值//定義復雜多行的函數 #define MACRO(arg1, arg2) do { \\ stmt1; \ stmt2; \\ } while(0)//關鍵是要在每一個換行的時候加上一個 "\ "

使用define定義一個多行的復雜函數,關鍵是要在每一個換行的時候加上一個 \;

4.define 防止頭文件重復包含

通過 #ifndef / #define 解決頭文件重復包含

#ifndef __XXX_H__ #define __XXX_H__int a=1;#endif

上面的偽代碼如下:

如果(沒有定義宏__XXX_H__) {那么直接定義宏__XXX_H__定義變量a 并且賦值為 1 } 結束程序
  • 假如第一次包含時,由于沒有定義宏 __XXX_H**,所以做了兩件事,定義宏 __XXX_H**,然后定義 int a = 1;
  • 假如第二次包含時,由于已經定義宏 __XXX_H__,所以啥都不做;
  • 假如第 N 次包含時,由于已經定義宏 __XXX_H__,所以啥都不做;
  • 整個過程,無論頭文件被包含多少次,變量 a 只被定義一次,不會有重復包含重復定義的問題存在!

三.const 和 define 區別

1.就起作用的階段而言

#define 是在編譯的預處理階段起作用,而 const 是在 編譯、運行的時候起作用。

2.就起作用的方式而言

#define 只是簡單的字符串替換,沒有類型檢查。而 const 有對應的數據類型,是要進行判斷的,可以避免一些低級的錯誤。

3.就存儲方式而言

#define 只是進行展開,有多少地方使用,就替換多少次,它定義的宏常量在內存中有若干個備份; const 定義的只讀變量在程序運行過程中只有一份備份。

4.從代碼調試的方便程度而言

const 常量可以進行調試的,define 是不能進行調試的,因為在預編譯階段就已經替換掉了。

5.從效率程度而言

編譯器通常不為普通 const 常量分配存儲空間,而是將它們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內存的操作,使得它的效率也很高

四.const 優點

  • 1.const 常量有數據類型,而宏常量沒有數據類型。編譯器可以對前者進行類型安全檢查。而對后者只進行字符替換,沒有類型安全檢查,并且在字符替換可能會產生意料不到的錯誤。
  • 2.有些集成化的調試工具可以對 const 常量進行調試,但是不能對宏常量進行調試。
  • 3.const 可節省空間,避免不必要的內存分配,提高效率

五.猜你喜歡

  • C 語言 數組下標越界和內存溢出區別
  • C 語言 指針聲明和定義
  • C 語言 指針 p++ / p–
  • C 語言 p++/§++/_(p++)/_p++
  • C 語言 使用指針遍歷數組
  • C 語言 指針和數組區別
  • C 語言 指針數組和數組指針區別
  • C 語言 空指針 NULL
  • C 語言 void 指針
  • C 語言 野指針
  • C 語言 函數值傳遞和址傳遞
  • C 語言 函數缺省參數
  • C 語言 函數不定長參數
  • C 語言 函數指針
  • C 語言 指針函數
  • C 語言 回調函數 callback
  • C 語言 typedef
  • C 語言 define 定義常量
  • C 語言 define 防止頭文件重復包含
  • C 語言 #pragma once
  • C 語言 #include <> 與 #include “” 區別
  • C 語言 const 修飾變量
  • C 語言 const 修飾指針
  • C語言 const 修飾函數
  • C 語言 const 修飾函數參數
  • C 語言 const 和 define 區別
  • 未經允許不得轉載:猿說編程 ? C 語言 const 和 define 區別

    總結

    以上是生活随笔為你收集整理的C语言 const 和 define 区别 - C语言零基础入门教程的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。