激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - C/C++ - 關于C語言 const 和 define 區別

關于C語言 const 和 define 區別

2022-01-04 15:07猿說編程 C/C++

這篇文章主要介紹了關于C語言 const 和 define 區別 的相關資料,需要的朋友可以參考下面文章內容

一.const 使用

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

1.const 修飾變量

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/******************************************************************************************/
//@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 Failed
 error: assignment of read-only variable 'a'
     6 |     a = 200 ;
       |     ~~^~~~~
 */

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

error: uninitialized 'const ' [-fpermissive]

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

2.const 修飾指針

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

3.const 修飾在函數名前面當

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

?
1
2
3
4
const char * GetString(void);
const int    GetInt(void);
const float  GetFloat(void);
const double GetDdouble(void);

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

?
1
2
3
4
5
6
7
const char * GetString(void);
 
//如下語句將出現編譯錯誤:
//char *str = GetString();
 
//正確的用法是
const char  *str = GetString();

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

?
1
2
3
int GetInt(void);
 
const int GetInt(void);

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

4.const 修飾在函數名后面

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

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/******************************************************************************************/
//@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_num
    talk();  // 編譯錯誤,企圖調用非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 定義標識符的一般形式為:

?
1
2
3
4
5
#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 定義函數

?
1
2
3
4
5
6
7
8
//定義常量
#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 定義多行函數

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
//定義常量
#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 解決頭文件重復包含

?
1
2
3
4
5
6
#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語言 const 和 define 區別的文章就介紹到這了,更多相關C語言 const 和 define 區別 內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://www.cnblogs.com/shuopython/p/15245776.html

延伸 · 閱讀

精彩推薦
  • C/C++學習C++編程的必備軟件

    學習C++編程的必備軟件

    本文給大家分享的是作者在學習使用C++進行編程的時候所用到的一些常用的軟件,這里推薦給大家...

    謝恩銘10102021-05-08
  • C/C++C/C++經典實例之模擬計算器示例代碼

    C/C++經典實例之模擬計算器示例代碼

    最近在看到的一個需求,本以為比較簡單,但花了不少時間,所以下面這篇文章主要給大家介紹了關于C/C++經典實例之模擬計算器的相關資料,文中通過示...

    jia150610152021-06-07
  • C/C++C語言中炫酷的文件操作實例詳解

    C語言中炫酷的文件操作實例詳解

    內存中的數據都是暫時的,當程序結束時,它們都將丟失,為了永久性的保存大量的數據,C語言提供了對文件的操作,這篇文章主要給大家介紹了關于C語言中文件...

    針眼_6702022-01-24
  • C/C++c++ 單線程實現同時監聽多個端口

    c++ 單線程實現同時監聽多個端口

    這篇文章主要介紹了c++ 單線程實現同時監聽多個端口的方法,幫助大家更好的理解和學習使用c++,感興趣的朋友可以了解下...

    源之緣11542021-10-27
  • C/C++C++之重載 重定義與重寫用法詳解

    C++之重載 重定義與重寫用法詳解

    這篇文章主要介紹了C++之重載 重定義與重寫用法詳解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下...

    青山的青6062022-01-04
  • C/C++詳解c語言中的 strcpy和strncpy字符串函數使用

    詳解c語言中的 strcpy和strncpy字符串函數使用

    strcpy 和strcnpy函數是字符串復制函數。接下來通過本文給大家介紹c語言中的strcpy和strncpy字符串函數使用,感興趣的朋友跟隨小編要求看看吧...

    spring-go5642021-07-02
  • C/C++深入理解goto語句的替代實現方式分析

    深入理解goto語句的替代實現方式分析

    本篇文章是對goto語句的替代實現方式進行了詳細的分析介紹,需要的朋友參考下...

    C語言教程網7342020-12-03
  • C/C++C語言實現電腦關機程序

    C語言實現電腦關機程序

    這篇文章主要為大家詳細介紹了C語言實現電腦關機程序,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下...

    xiaocaidayong8482021-08-20
主站蜘蛛池模板: 久久人人97超碰国产公开结果 | av手机免费在线观看 | 色七七网站 | 欧美一区黄色 | 日本一道aⅴ不卡免费播放 日日草夜夜操 | 久久精品欧美一区二区三区不卡 | 亚洲精品v天堂中文字幕 | 黄色片免费看看 | 欧美在线电影 | 亚洲一区二区不卡视频 | 欧美精品一区二区视频 | 亚洲国产精品久久久久制服红楼梦 | 久久久久久久久国产 | 日韩在线观看视频免费 | 日韩理论电影网 | 色交视频| av在线1 | 日日操日日操 | 毛片在线免费 | 国产精品久久久久久久久久东京 | 国内精品久久久久久影视8 嫩草影院在线观看网站成人 | 久久国产一二三 | 国产一级小视频 | 久久成人精品视频 | 九九热精品视频在线播放 | 亚洲国产高清自拍 | 久久成人视屏 | 欧美一级黑人 | 日韩av片网站 | 电影av在线 | 免费一级毛片在线播放视频 | 日本aaaa片毛片免费观看视频 | 成年人免费黄色片 | 羞羞的视频在线观看 | 国产亚洲精品久久久久婷婷瑜伽 | 国产亚洲欧美一区久久久在 | 成人免费一区 | 成人免费毛片片v | 久久精品com | 欧美成人三级视频 | 亚洲小视频在线 |