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

C語言宏定義#define的使用

 更新時(shí)間:2022年01月10日 09:53:25   作者:南城Flipped  
本文主要介紹了C語言宏定義#define的使用,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

        宏定義是高級(jí)語言編譯器提供的常用語法,其目的是利用某一標(biāo)識(shí)符標(biāo)識(shí)某個(gè)文本字符串。在編寫程序時(shí),如果程序中反復(fù)地使用某個(gè)數(shù)據(jù)或某段程序片段,就可以考慮將這個(gè)數(shù)據(jù)或程序片段定義為宏,然后每個(gè)出現(xiàn)該數(shù)據(jù)或程序片段的地方用宏名替代,選擇宏定義來做的好處是程序簡(jiǎn)潔,可讀性好,而且當(dāng)需要修改這些相同的程序片段時(shí),只要修改宏定義中的字符串即可,不需要修改多處。

        宏定義命令:define

       優(yōu)點(diǎn):方便程序的修改,同時(shí)也能提高程序的運(yùn)行效率。

        宏定義一般有兩種形式:無參宏定義和帶參宏定義。

無參宏定義

定義形式

#define 標(biāo)識(shí)符 字符串

注意:
        1.宏定義是用宏名來表示一個(gè)字符串,在宏展開時(shí)以該字符串取代宏名,只是簡(jiǎn)單的替換,字符串中可以含任何字符,可以是常數(shù),也可以是表達(dá)式,預(yù)處理不作任何檢查。只在編譯時(shí)檢查。
        2.宏定義行末不必加分號(hào)(除非你的宏內(nèi)容中需要有分號(hào))。
        3.宏定義必須寫在函數(shù)之外,作用域?yàn)楹甓x命令起到源程序結(jié)束。如要終止其作用域可使用#undef命令 

例1:輸入圓的半徑輸出圓的周長(zhǎng)和面積

#include <stdio.h>
#define PI 3.14 
int main(){
    int r;
    printf("輸入半徑:");
    scanf("%d",&r);
	printf("圓的周長(zhǎng)為:%.2f,面積為:%.2f",2*PI*r,PI*r*r); 
    return 0;
}

預(yù)處理階段進(jìn)行宏替換↓:

#include <stdio.h>
int main(){
    int r;
    printf("輸入半徑:");
    scanf("%d",&r);
	printf("圓的周長(zhǎng)為:%.2f,面積為:%.2f",2*3.14*r,3.14*r*r); 
    return 0;
}

代碼輸出: 

 例2:通過宏定義輸出字符串

#include <stdio.h>
#define HELLO "Hello,"
#define WORLD "World!"
int main(){
    printf(HELLO WORLD);
    return 0;
}

預(yù)處理階段進(jìn)行宏替換↓:

#include <stdio.h>
int main(){
    printf("Hello," "World!");
    return 0;
}

代碼輸出:

 

例3:請(qǐng)問如下代碼S1和S2的輸出是否相等

 
#include <stdio.h>
#define S1 3+4
#define S2 (3+4)
int main(){
    printf("S1:%d\n",S1*5);
    printf("S2:%d\n",S2*5);
    return 0;
}

預(yù)處理進(jìn)行宏替換↓(這里就體現(xiàn)出了直接替換并不會(huì)因?yàn)槟愕暮晗榷x就先計(jì)算,而是替換后再做后續(xù)處理):

#include <stdio.h>
#define S1 3+4
#define S2 (3+4)
int main(){
    printf("S1:%d\n",3+4*5);
    printf("S2:%d\n",(3+4)*5);
    return 0;
}

 代碼輸出:

 帶參宏定義

定義形式

#define 宏名(形參表) 字符串

例1:M(3)==N(3)?  M(3+2)==N(3+2)?

#include<stdio.h>
#define  M(y)  ((y)*(y)+3*(y))
#define  N(y)  (y*y+3*y)
int main(){
	printf("M(3):%d\n",M(3));
	printf("N(3):%d\n",N(3));
	
	printf("M(3+2):%d\n",M(3+2));
	printf("N(3+2):%d\n",N(3+2));
}

預(yù)處理階段進(jìn)行宏替換↓(這個(gè)例題主要是為了提醒大家如果要用宏定義進(jìn)行一些計(jì)算,最好將參與計(jì)算的所有變量都加上括號(hào)以防本題中的情況出現(xiàn)):

#include<stdio.h>
#define  M(y)  ((y)*(y)+3*(y))
#define  N(y)  (y*y+3*y)
int main(){
	printf("M(3):%d\n",((3)*(3)+3*(3)));
	printf("N(3):%d\n",(3*3+3*3));
	
	printf("M(3+2):%d\n",((3+2)*(3+2)+3*(3+2)));
	printf("N(3+2):%d\n",(3+2*3+2+3*3+2));
}

 代碼輸出:

 例2:通過宏來計(jì)算數(shù)組中元素個(gè)數(shù)

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define Size_Array(b) sizeof(b)/sizeof(b[0])
int main(){
	int i;
	srand((unsigned)time(NULL));
	int b[i=rand()%100];
	printf("隨機(jī)數(shù)為:%d 數(shù)組元素個(gè)數(shù)為:%d",i,Size_Array(b));
}

 預(yù)處理階段進(jìn)行宏替換↓(很經(jīng)典的面試小題):

#include<stdio.h>
#include<stdlib.h>
#include<time.h>
int main(){
	int i;
    srand((unsigned)time(NULL));
	int b[i=rand()%100];
	printf("隨機(jī)數(shù)為:%d 數(shù)組元素個(gè)數(shù)為:%d",i,sizeof(b)/sizeof(b[0]));
}

 代碼輸出:

#和##運(yùn)算 

#運(yùn)算 用法:

        # 運(yùn)算符的用處就是把符號(hào)轉(zhuǎn)化為字符串。例如,如果 a 是一個(gè)宏的形參,則替換文本中的 #a 則被系統(tǒng)轉(zhuǎn)化為 “a”。        

#include <stdio.h>
#define TO_STR(s) #s
int main(){
    printf(TO_STR(HelloWorld!));
    return 0;
}

 代碼輸出: 

##運(yùn)算 用法:

        ## 運(yùn)算符可以用在替換文本中,而它的作用是起到粘合的作用,即將兩個(gè)符號(hào)組合成一個(gè)符號(hào)。

#include <stdio.h>
#define CONCAT(x,y) x##y
int main(){
    printf("%d", CONCAT(1,000));
    return 0;
}

  代碼輸出:

變參宏

用法:

        當(dāng)要調(diào)用printf類似不確定參數(shù)格式時(shí)可以使用__VA_ARGS__,在宏定義中,形參列表的最后一個(gè)參數(shù)為省略號(hào)“…”,“__VA_ARGS__”就可以被用在替換文本中,來表示“…”代表了什么。     

#define PR(...) printf(__VA_ARGS__)     //宏定義
PR("hello\n");                          //宏調(diào)用

例:

#include <stdio.h>
#define P(X, ...) printf("get:"#X":"__VA_ARGS__)
int main(){
    int j=20,i=10;
    P(10, "j = %d\n", j); 
	P(10, "j = %d i=%d\n", j,i);      
    return 0;
}

   代碼輸出:

 

#ifndef 條件編譯

        #ifndef 的最主要目的是防止頭文件的重復(fù)包含和編譯?! ?/p>

        c語言中,對(duì)同一個(gè)變量或者函數(shù)進(jìn)行多次聲明不會(huì)報(bào)錯(cuò)。所以如果.h文件里進(jìn)行了聲明工作,不使用# ifndef宏定義,多個(gè)c文件包含同一個(gè).h文件也不會(huì)報(bào)錯(cuò)。

  然而c++中,#ifdef的作用域只是在單個(gè)文件中。所以如果.h文件里定義了全局變量,即使采用#ifdef宏定義,多個(gè).c文件包含同一個(gè).h文件就會(huì)出現(xiàn)全局變量重定義的錯(cuò)誤。

        使用#ifndef可以避免這種錯(cuò)誤:

#ifndef x    //先測(cè)試x是否被宏定義過
#define x
   code1     //如果x沒有被宏定義過,定義x,并編譯code1
#endif   
  code2     //如果x已經(jīng)定義過了則編譯code2,跳過code1

        適當(dāng)?shù)氖褂脳l件編譯和宏定義可以讓代碼的運(yùn)行效率更高,特別是在進(jìn)行大項(xiàng)目的時(shí)候當(dāng)某個(gè)數(shù)值使用次數(shù)較多且修改比較頻繁的情況下,宏定義也是比較高效的(當(dāng)然函數(shù)也可以,等有時(shí)間寫完函數(shù)再來比較一下函數(shù)和宏的優(yōu)缺點(diǎn)吧) 

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

相關(guān)文章

  • C語言結(jié)構(gòu)體內(nèi)存對(duì)齊詳解

    C語言結(jié)構(gòu)體內(nèi)存對(duì)齊詳解

    大家好,本篇文章主要講的是C語言結(jié)構(gòu)體內(nèi)存對(duì)齊詳解,感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • c語言strftime時(shí)間格式化示例

    c語言strftime時(shí)間格式化示例

    C/C++程序中需要程序顯示當(dāng)前時(shí)間,可以使用標(biāo)準(zhǔn)函數(shù)strftime,本文提供一個(gè)示例供大家參考
    2014-02-02
  • 解析VC中預(yù)編譯頭文件的深入分析

    解析VC中預(yù)編譯頭文件的深入分析

    本篇文章是對(duì)VC中預(yù)編譯頭文件進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下
    2013-05-05
  • C++數(shù)據(jù)結(jié)構(gòu)之堆詳解

    C++數(shù)據(jù)結(jié)構(gòu)之堆詳解

    本文詳細(xì)講解了C++數(shù)據(jù)結(jié)構(gòu)之堆,文中通過示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2022-04-04
  • C++數(shù)據(jù)精度問題(對(duì)浮點(diǎn)數(shù)保存指定位小數(shù))

    C++數(shù)據(jù)精度問題(對(duì)浮點(diǎn)數(shù)保存指定位小數(shù))

    這篇文章主要介紹了對(duì)浮點(diǎn)數(shù)保存指定位小數(shù)。比如, 1.123456. 要保存1位小數(shù),,調(diào)用方法后, 保存的結(jié)果為: 1.1。 再比如,1.98765, 保存2位小數(shù)的結(jié)果為: 2.00,需要的朋友可以參考下
    2017-08-08
  • 詳解C++的反調(diào)試技術(shù)與繞過手法

    詳解C++的反調(diào)試技術(shù)與繞過手法

    反調(diào)試技術(shù),惡意代碼會(huì)用它識(shí)別自身是否被調(diào)試,或者讓調(diào)試器失效,給反病毒工程師們制造麻煩,拉長(zhǎng)提取特征碼的時(shí)間線,本章將具體總結(jié)常見的反調(diào)試基礎(chǔ)的實(shí)現(xiàn)原理以及如何過掉這些反調(diào)試手段,從而讓我們能夠繼續(xù)分析惡意代碼
    2021-06-06
  • 詳解利用C語言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池

    詳解利用C語言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池

    這篇文章主要給大家介紹了關(guān)于C語言如何實(shí)現(xiàn)簡(jiǎn)單的內(nèi)存池的相關(guān)資料,設(shè)計(jì)內(nèi)存池的目標(biāo)是為了保證服務(wù)器長(zhǎng)時(shí)間高效的運(yùn)行,通過對(duì)申請(qǐng)空間小而申請(qǐng)頻繁的對(duì)象進(jìn)行有效管理,減少內(nèi)存碎片的產(chǎn)生,合理分配管理用戶內(nèi)存,需要的朋友可以參考下
    2021-08-08
  • C++ spdlog日志庫(kù)示例詳解

    C++ spdlog日志庫(kù)示例詳解

    本文詳細(xì)介紹了C++的spdlog日志庫(kù),包括其核心優(yōu)勢(shì)、核心概念、基本用法、高級(jí)用法與特性、性能考量與最佳實(shí)踐、編譯與依賴以及庫(kù)的下載與編譯,spdlog是一個(gè)高性能、功能豐富且易于使用的開源日志庫(kù),適用于各種C++項(xiàng)目,感興趣的朋友跟隨小編一起看看吧
    2025-12-12
  • C++使用expected實(shí)現(xiàn)優(yōu)雅的錯(cuò)誤處理

    C++使用expected實(shí)現(xiàn)優(yōu)雅的錯(cuò)誤處理

    C++ 中提供了很多中方式進(jìn)行錯(cuò)誤處理。無論是通過拋異常還是通過錯(cuò)誤碼,標(biāo)準(zhǔn)庫(kù)都提供相應(yīng)的調(diào)用,今天本文為大家介紹的是使用expected進(jìn)行錯(cuò)誤處理,感興趣的可以了解一下
    2023-06-06
  • C++深入探究不同的繼承體系

    C++深入探究不同的繼承體系

    繼承是C++面向?qū)ο缶幊讨械囊婚T。繼承是子類繼承父類的特征和行為,或者是繼承父類得方法,使的子類具有父類得的特性和行為。重寫是子類對(duì)父類的允許訪問的方法實(shí)行的過程進(jìn)行重新編寫,返回值和形參都不能改變。就是對(duì)原本的父類進(jìn)行重新編寫,但是外部接口不能被重寫
    2022-05-05

最新評(píng)論

西吉县| 商洛市| 年辖:市辖区| 宁蒗| 同仁县| 漳浦县| 桓台县| 八宿县| 延寿县| 庄浪县| 师宗县| 阳新县| 万源市| 宁波市| 宜丰县| 西和县| 聊城市| 德兴市| 阳西县| 西丰县| 收藏| 上林县| 梅河口市| 将乐县| 临安市| 泰兴市| 财经| 镇江市| 沙雅县| 龙里县| 时尚| 汉源县| 洮南市| 鹿泉市| 澄城县| 铁力市| 西安市| 泽库县| 万全县| 海原县| 涞源县|