最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C語(yǔ)言中#define定義的標(biāo)識(shí)符和宏實(shí)例代碼

 更新時(shí)間:2022年03月07日 10:07:06   作者:誠(chéng)摯的喬治  
C語(yǔ)言中,可以用#define定義一個(gè)標(biāo)識(shí)符來(lái)表示一個(gè)常量,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言中#define定義的標(biāo)識(shí)符和宏的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

??1.#define定義標(biāo)識(shí)符

在C語(yǔ)言程序中,有時(shí)候會(huì)包含#define

#define可以定義標(biāo)識(shí)符

也就是說(shuō)可以對(duì)字符重新定義,實(shí)現(xiàn)代替的作用

??語(yǔ)法

#define  name  stuff 

就比如說(shuō):

#define MAX 1000(用MAX代替1000)

#define reg   register (用reg代替register)

??舉個(gè)栗子

#include<stdio.h>
#define MAX 100
int main()
{
	printf("%d", MAX);
	return 0;
}

當(dāng)代碼運(yùn)行的時(shí)候

在代碼編譯的預(yù)處理階段 就會(huì)把宏替換為文本程序代碼

代替的結(jié)果如下:

#include<stdio.h>
int main()
{
	printf("%d", 100);
	return 0;
}

??注意:#define定義標(biāo)識(shí)符后面盡量不加上分號(hào),因?yàn)槿绻由系脑挘谔鎿Q的過(guò)程中,分號(hào)也會(huì)別替換到文本程序中,有時(shí)候會(huì)導(dǎo)致出現(xiàn)邏輯錯(cuò)誤。

??2.#define定義宏

#define規(guī)定允許將參數(shù)替換到文本中,這樣包含參數(shù)叫做#define定義宏

宏在程序中,執(zhí)行的速度更快,因?yàn)橄鄬?duì)于函數(shù),宏沒(méi)有函數(shù)的調(diào)用和返回的開(kāi)銷

語(yǔ)法:
#define SQUARE(x)   x*x

這與#define定義宏一樣,都是完成替換的,不過(guò)#define定義宏后面有一個(gè)括號(hào),包含參數(shù)

??下面用#define定義宏來(lái)實(shí)現(xiàn)兩個(gè)數(shù)求最大值

#include<stdio.h>
#define MAX(x,y) ((x)>(y)?(x):(y))
int main()
{
	int a = 20;
	int b = 10;
	int c = MAX(a,b);
	printf("%d", c);
	return 0;
}

替換后的結(jié)果為:

#include<stdio.h>
int main()
{
	int a = 20;
	int b = 10;
	int c = a>b?a:b;
	printf("%d", c);
	return 0;
}

 在#define定義宏的時(shí)候,后面的參數(shù)盡量帶上括號(hào),使每一個(gè)參數(shù)相對(duì)獨(dú)立

這樣可以避免由于操作符的優(yōu)先級(jí)不同,導(dǎo)致最終的邏輯就錯(cuò)了

舉個(gè)栗子:

#include<stdio.h>
#define sum(x) x*x
int main()
{
	int ret = sum(3 + 3);
	printf("%d", ret);
}

如果不仔細(xì)觀察的話,可能你認(rèn)為的結(jié)果就是36

這個(gè)代碼的計(jì)算過(guò)程為:3+3*3+3,并不是(3+3)*(3+3)

??#define替換的規(guī)則

#define定義標(biāo)識(shí)符和宏時(shí),程序會(huì)繼續(xù)如下步驟

1.在定義宏時(shí),先對(duì)參數(shù)進(jìn)行檢查,如果參數(shù)里包含有#define定義的標(biāo)識(shí)符時(shí),首先完成相應(yīng)的替換

 

2.替換文本會(huì)隨后插入到原來(lái)文本文件中,對(duì)于宏來(lái)說(shuō),參數(shù)名被他們的值所替換

 

3.最后進(jìn)行檢查,果然還有#define定義的符號(hào),將重復(fù)上述的操作

 注意:

1.#define參數(shù)中可以包含其他由#define定義的標(biāo)識(shí)符,但是#define不能遞歸

2.如果#define的參數(shù)名存在在字符串中,將不會(huì)完成替換

??#與## #的用法:

在不確定參數(shù)的情況下,可以使用 “#n” ,可以實(shí)現(xiàn)不同字符串的插入

效果如下:

#include<stdio.h>
#define PRINT(n) printf("the value of "#n" is %d\n",n);
int main()
{
	int a = 10;
	PRINT(a);
	int b = 20;
	PRINT(b);
    int c= 30;
    PRINT(c);
	return 0;
}

??替換后的效果為:

#include<stdio.h>
int main()
{
	int a = 10;
    printf("the value of" "a" " is %d\n",a);
	PRINT(a);
	int b = 20;
	PRINT(b);
    printf("the value of " "b" " is %d\n",b);
    int c= 30;
    PRINT(c);
    printf("the value of " "c" " is %d\n",c);
	return 0;
} 

##的用法:

#include<stdio.h>
#define CAT(Max,num) Max##nu
int main()
{
	int Maxnum = 100;
	printf("%d", Maxnum);
	return 0;
}

雙##的用法可以拼接兩個(gè)字符串

當(dāng)然這個(gè)前提是拼接后的字符串必須產(chǎn)生一個(gè)合法的標(biāo)識(shí)符,否則結(jié)果就是未定義的

??宏的缺點(diǎn)

 1.如果使用宏過(guò)多,宏定義的代碼插入到程序中,會(huì)大幅度增加程序的長(zhǎng)度

2.宏是沒(méi)法調(diào)試的

3.宏與類型無(wú)關(guān),導(dǎo)致程序不夠嚴(yán)謹(jǐn)

4.宏會(huì)帶來(lái)優(yōu)先級(jí)的問(wèn)題,容易導(dǎo)致程序的錯(cuò)誤

 ??宏和函數(shù)的優(yōu)缺點(diǎn)      

1).在代碼長(zhǎng)度角度上,因?yàn)楹晔侵苯犹鎿Q所以若宏較長(zhǎng)會(huì)增加代碼長(zhǎng)度

2).在執(zhí)行速度上,宏較函數(shù)快,因?yàn)楹瘮?shù)存在調(diào)用/返回時(shí)的額外開(kāi)銷

3).在參數(shù)求值方面,define定義的宏可能會(huì)具有副作用會(huì)導(dǎo)致修改變量最后的值,而函數(shù)即使調(diào)用多次也不會(huì)修改變量原來(lái)的值

4).在參數(shù)類型方面,宏與類型無(wú)關(guān),所以宏是可以傳參數(shù)的而函數(shù)不行在C中函數(shù)是不可以傳類型的

 5).在是否可調(diào)試方面,宏不可調(diào)試,函數(shù)可調(diào)試宏可以傳類型的檢測(cè),實(shí)現(xiàn)malloc(動(dòng)態(tài)開(kāi)辟內(nèi)存的函數(shù))

#include<stdio.h>
#include<stdlib.h>
#define MALLOC(COUNT,TYPE)\
    (TYPE *)alloc(COUNT*sizeof(TYPE))
void *alloc(int sz)   //宏可以傳類型,函數(shù)不可以傳類型
{
    void *p=malloc(sz);
    if(p == NULL)
    {
        printf("out of memory\n");
        exit(EXIT_FAILURE);
    }
    return p;
}
int main()
{
    int i=0;
    int *p=MALLOC(10,int);
    for(i=0;i<10;i++)
    {
        *(p+i)=i;
    }
    for(i=0;i<10;i++)
    {
        printf("%d ",*(p+i));
    }
    free(p);
    system("pause");
    return 0;
}

總結(jié)

到此這篇關(guān)于C語(yǔ)言中#define定義的標(biāo)識(shí)符和宏的文章就介紹到這了,更多相關(guān)C語(yǔ)言#define定義標(biāo)識(shí)符和宏內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 關(guān)于C++中push_back()函數(shù)的用法及代碼實(shí)例

    關(guān)于C++中push_back()函數(shù)的用法及代碼實(shí)例

    push_back是vector的一個(gè)方法,表示將一個(gè)元素存儲(chǔ)到容器的末尾,下面這篇文章主要給大家介紹了關(guān)于C++中push_back()函數(shù)用法的相關(guān)資料,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-11-11
  • Opencv實(shí)現(xiàn)輪廓提取功能

    Opencv實(shí)現(xiàn)輪廓提取功能

    這篇文章主要為大家詳細(xì)介紹了Opencv實(shí)現(xiàn)輪廓提取功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-05-05
  • VC實(shí)現(xiàn)圖片拖拽及動(dòng)畫的實(shí)例

    VC實(shí)現(xiàn)圖片拖拽及動(dòng)畫的實(shí)例

    這篇文章介紹了VC實(shí)現(xiàn)圖片拖拽及動(dòng)畫的實(shí)例,有需要的朋友可以參考一下
    2013-08-08
  • Qt 智能指針的具體使用

    Qt 智能指針的具體使用

    本文主要介紹了Qt 智能指針的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2025-03-03
  • 數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解

    數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解

    這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu)之伸展樹(shù)詳解,本文對(duì)伸展樹(shù)(Splay Tree)的單旋轉(zhuǎn)操作、一字型旋轉(zhuǎn)、之字形旋轉(zhuǎn)區(qū)間操作等理論知識(shí)做了講解,并給出實(shí)現(xiàn)代碼,需要的朋友可以參考下
    2014-08-08
  • QT結(jié)合百度Ai實(shí)現(xiàn)車牌識(shí)別

    QT結(jié)合百度Ai實(shí)現(xiàn)車牌識(shí)別

    當(dāng)下的人工智能勢(shì)頭很盛,本文主要介紹了QT結(jié)合百度Ai實(shí)現(xiàn)車牌識(shí)別,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-03-03
  • C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言詳細(xì)分析講解內(nèi)存管理malloc realloc free calloc函數(shù)的使用

    C語(yǔ)言內(nèi)存管理相關(guān)的函數(shù)主要有realloc、calloc、malloc、free等,下面這篇文章主要給大家介紹了關(guān)于C語(yǔ)言內(nèi)存管理realloc、calloc、malloc、free函數(shù)的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言實(shí)現(xiàn)學(xué)生學(xué)籍管理系統(tǒng),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • C++關(guān)鍵字typename的深入理解

    C++關(guān)鍵字typename的深入理解

    本篇文章是對(duì)C++中的關(guān)鍵字typename進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++中關(guān)鍵字Struct和Class的區(qū)別

    C++中關(guān)鍵字Struct和Class的區(qū)別

    這篇文章主要介紹了C++中關(guān)鍵字Struct和Class的區(qū)別,本文用大量實(shí)例講解了Struct和Class的區(qū)別,需要的朋友可以參考下
    2014-09-09

最新評(píng)論

黔东| 岑溪市| 嘉义县| 宁远县| 东宁县| 乐至县| 商河县| 邛崃市| 涪陵区| 屏山县| 易门县| 永川市| 南康市| 东莞市| 诸城市| 天镇县| 赫章县| 九龙坡区| 滁州市| 瓦房店市| 饶阳县| 聂荣县| 清苑县| 扬中市| 类乌齐县| 隆德县| 蛟河市| 兴山县| 安福县| 金阳县| 车致| 满洲里市| 乌拉特后旗| 从江县| 冕宁县| 电白县| 那曲县| 金川县| 柞水县| 肥城市| 宁海县|