欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語言宏定義#define的使用

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

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

        宏定義命令:define

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

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

無參宏定義

定義形式

#define 標識符 字符串

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

例1:輸入圓的半徑輸出圓的周長和面積

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

預處理階段進行宏替換↓:

#include <stdio.h>
int main(){
    int r;
    printf("輸入半徑:");
    scanf("%d",&r);
	printf("圓的周長為:%.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;
}

預處理階段進行宏替換↓:

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

代碼輸出:

 

例3:請問如下代碼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;
}

預處理進行宏替換↓(這里就體現(xiàn)出了直接替換并不會因為你的宏先定義就先計算,而是替換后再做后續(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));
}

預處理階段進行宏替換↓(這個例題主要是為了提醒大家如果要用宏定義進行一些計算,最好將參與計算的所有變量都加上括號以防本題中的情況出現(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:通過宏來計算數(shù)組中元素個數(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("隨機數(shù)為:%d 數(shù)組元素個數(shù)為:%d",i,Size_Array(b));
}

 預處理階段進行宏替換↓(很經(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("隨機數(shù)為:%d 數(shù)組元素個數(shù)為:%d",i,sizeof(b)/sizeof(b[0]));
}

 代碼輸出:

#和##運算 

#運算 用法:

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

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

 代碼輸出: 

##運算 用法:

        ## 運算符可以用在替換文本中,而它的作用是起到粘合的作用,即將兩個符號組合成一個符號。

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

  代碼輸出:

變參宏

用法:

        當要調(diào)用printf類似不確定參數(shù)格式時可以使用__VA_ARGS__,在宏定義中,形參列表的最后一個參數(shù)為省略號“…”,“__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 的最主要目的是防止頭文件的重復包含和編譯?! ?/p>

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

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

        使用#ifndef可以避免這種錯誤:

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

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

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

相關(guān)文章

  • 紅黑樹的使用詳解

    紅黑樹的使用詳解

    本篇文章是對紅黑樹的使用詳解。需要的朋友參考下
    2013-05-05
  • C語言實現(xiàn)學生信息管理系統(tǒng)(多文件)

    C語言實現(xiàn)學生信息管理系統(tǒng)(多文件)

    這篇文章主要為大家詳細介紹了C語言實現(xiàn)學生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-12-12
  • 詳解C++設(shè)計模式編程中建造者模式的實現(xiàn)

    詳解C++設(shè)計模式編程中建造者模式的實現(xiàn)

    這篇文章主要介紹了C++設(shè)計模式編程中建造者模式的實現(xiàn),建造者模式將一個復雜對象的構(gòu)建于它的表現(xiàn)分離,可以減少代碼冗余,需要的朋友可以參考下
    2016-03-03
  • C++檢查某個文件或目錄是否存在的函數(shù)

    C++檢查某個文件或目錄是否存在的函數(shù)

    這篇文章主要介紹了C++檢查某個文件或目錄是否存在的函數(shù),是Windows應(yīng)用程序設(shè)計中非常常見的實用技巧,需要的朋友可以參考下
    2014-10-10
  • C++按位異或運算符的使用介紹

    C++按位異或運算符的使用介紹

    本篇文章對C++按位異或運算符的使用進行了詳細的分析介紹。需要的朋友參考下
    2013-05-05
  • VS2017中配置QT5.12.0的圖文教程

    VS2017中配置QT5.12.0的圖文教程

    本文主要介紹了VS2017中配置QT5.12.0的圖文教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-06-06
  • C++ 強制類型轉(zhuǎn)換詳解

    C++ 強制類型轉(zhuǎn)換詳解

    這篇文章主要介紹的是C++ 強制類型轉(zhuǎn)換詳解,C語言中的強制轉(zhuǎn)換主要用于普通數(shù)據(jù)類型、指針的強制轉(zhuǎn)換,沒有類型檢查,轉(zhuǎn)換不安全,下面我們來看看其具體語法及詳細內(nèi)容
    2021-11-11
  • C語言軟件spi虛擬總線中間層設(shè)計詳解

    C語言軟件spi虛擬總線中間層設(shè)計詳解

    這篇文章主要為大家介紹了C語言軟件spi虛擬總線中間層設(shè)計詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • C++小練習之高性能實現(xiàn)字符串分割

    C++小練習之高性能實現(xiàn)字符串分割

    字符串分割是日常工作中比較常見的基礎(chǔ)函數(shù),通常大家會使用現(xiàn)成的基礎(chǔ)庫,基礎(chǔ)庫的性能是否是最佳的,本文主要和大家探討一下如何最大限度的提升字符串分割的性能,希望對大家有所幫助
    2023-10-10
  • java 出現(xiàn)NullPointerException的原因及解決辦法

    java 出現(xiàn)NullPointerException的原因及解決辦法

    這篇文章主要介紹了java 出現(xiàn)NullPointerException的原因及解決辦法的相關(guān)資料,這里說明出現(xiàn)NullPointerException 的原因的總結(jié),并說明該如何解決,需要的朋友可以參考下
    2017-08-08

最新評論