如何在C 中定義巨集常量pi

時間 2021-08-11 17:34:55

1樓:飛雪射鹿笑倚鴛

c++中用巨集來定義pi,可以這樣:

#define pi 3.1415926

說明:巨集定義的格式是:

#define 巨集名 字串

對照上面的定義,巨集名是pi,字串是3.1415926。

編譯器在編譯程式時,先使用巨集名代表的字串把所有巨集名替換,然後再進行編譯。

注意點:

巨集定義後面不需要分號;

巨集名的命名和標準變數的命名規則相同,不允許數字開頭。

作為程式設計習慣,一邊用全大寫字母作為巨集名,比如:max_item, min_num等等。

對於算術表示式的巨集定義,最好用小括號括起來,比如:

#define max_num (2+4)如果程式裡有4*max_num,預編譯被替代後就是4*(2+4),想想如果沒有括號,就會替代成4*2+4,兩者的結果截然不同,所以一定要注意這種定義。

2樓:奇俠傳五仙氣無

呃。巨集和常量是兩個概念,巨集定義是#define pi 3.141592653589793注意沒分號,編譯時所有的pi符號被自動替換成數。

常量定義是const double pi=3.141592653589793;就是定義一個不讓改數值的變數(其實有辦法改,但改動常量不符合程式設計規範),是要分配記憶體的。區別很大。

3樓:過客

#define pi 3.14159265

4樓:匿名使用者

巨集不是常量,需弄明白。

你可以這樣定義:#define pi 3.1415

在巨集定義#define pi 3.1415926中,用巨集名pi代替了一個()。

5樓:那年丶人已散盡

c語言中有明確規定,巨集定義是利用#define命令,用一個指定的標識代替一個字串。對應到題目上就是#define 識別符號 字串,所以pi是識別符號,3.1415926是字串。

所以這題選b

關於c選項,如果3.1415926不在巨集函式定義中,那麼它就是一個常量,只是因為它在#define命令中,所以它是一個字串。

a選項,單精度數是指計算機表達實數近似值的一種方式,而不是隻明確的值,故錯。

d選項,雙精度數也是值計算機表達實數近似值的一種方式,而不是隻明確的值,故錯。但是和單精度數有一點區別。具體體現在數字的範圍上。

擴充套件資料

巨集是一種預處理指令,它提供了一種機制,可以用來替換源**中的字串。

1、條件編譯:

c語言中,預處理過程讀入源**,檢查包含預處理指令的語句和巨集定義,並對源**進行相應的轉換,預處理過程還會刪除程式中的註釋和多餘的空白符號。

預處理指令是以#開頭的**行,#必須是該行除了空白字元外的第一個字元。#後是指令關鍵字,在#和指令關鍵字之間允許存在若干空白字元。

2、巨集函式:

函式的呼叫是需要一定的時間和空間代價的。因為系統在呼叫函式時,需要保留"現場",即將程式要執行的指令的下一條指令的位置壓入棧,然後轉入呼叫函式去執行,呼叫完函式後再返回主調函式,恢復"現場",返回到棧裡儲存的的下一條指令的位置繼續執行。

所以函式的呼叫需要額外的時間和空間代價。

而巨集函式則不存在上述問題,巨集函式在預編譯時,同函式定義的**來替換函式名,將函式**段嵌入到當前程式,不會產生函式呼叫。

6樓:呵呵呵呵

在#define中,標準只定義了#和##兩種操作。#用來把引數轉換成字串,##則用來連線前後兩個引數,把它們變成一個字串。

執行結果如下:

7樓:奕讓端雪

寫錯了吧。pi和3之間有個空格。

#define

pi3.14159

你的巨集沒有引數,不需要代替為()

8樓:匿名使用者

我剛剛翻了《c程式設計(第三版)》,裡面對巨集的具體定義是: #define 識別符號 字串。

。。我覺得應該果斷相信書裡面的定義

9樓:無敵理工男

c語言上有明確定義,巨集定義是利用#define命令,用一個指定的標識代替一個字串。

10樓:東方箭

在巨集定義中是沒有資料型別的,只是純粹的用 3.1415926替換pi

11樓:匿名使用者

我覺得選c,它字元常量,如果真是選b,知道後回帖。

12樓:友人改變自己

我也翻了翻書《c語言程式設計(第三版)》,面對巨集的具體定義是: #define 巨集名 替換文字,其中替換文字是一個不用雙引號引起來的一串字元(字串)。

選b妥妥的。

13樓:匿名使用者

要注意一下,如果是#define 3.14159那就是常量,但是如果有雙撇號,"3.14159"那是字串

14樓:驕子

選b.在第三版c語言,p204倒數第二段有明確的強調。

c++ 中define(巨集定義) 各種用法(含特殊),小舉個例子,謝謝!

15樓:會飛的小兔子

1、define是巨集定義,程式在預處理階段將用define定義的內容進行了替換。因此在程式執行時,常量表中並沒有用define定義的常量,系統不為它分配記憶體。而const定義的常量,在程式執行時,存在常量表中,且系統為它分配記憶體。

2、define定義的常量,預處理時只是直接進行了替換,因此在編譯時不能進行資料型別檢驗。而const定義的常量,在編譯時進行嚴格的型別檢驗,可以避免出錯。

3、define定義表示式時要注意「邊緣效應」。

例如:#definen1+2;

floata=n/2.0;

按照常規做法,可能會認為結果是3/2=1.5;

但是實際上,結果應該為1+2/2.0=2.0;

若想要實現3/2,則#definen(1+2);

即為避免邊緣效應,一定要加括號。

擴充套件資料c++巨集定義

#define命令是c++語言中的一個巨集定義命令,它用來將一個識別符號定義為一個字串,該識別符號被稱為巨集名,被定義的字串稱為替換文字。

1、簡單的巨集定義:

#define 《巨集名》 《字串》

例: #define pi 3.14159262、帶引數的巨集定義

#define 《巨集名》 (《參數列》) 《巨集體》

例: #define a(x) x

16樓:湖人總冠軍

1、define是巨集定義,在預處理階段,程式將替換define定義的內容,因此,當程式執行時,常量表中沒有用define定義的常量,系統不會為它分配記憶體,當程式執行時,const定義的常量存在於常量表中,並且系統為它分配記憶體。

2、define定義的常量,只在預處理期間直接替換,因此在編譯期間無法執行資料型別驗證,對於const定義的常量,在編譯時進行嚴格的型別檢查可以避免錯誤。

3、define定義表示式時要注意「邊緣效應」。

例如:#definen1+2;

floata=n/2.0;

按慣例,可認為結果為3/2=1.5;

但實際上,結果應該是1+2/2.0=2.0;

如果你想達到3/2,定義(1+2);

為了避免邊緣效應,必須加括號。

17樓:匿名使用者

1 無參巨集定義

無參巨集的巨集名後不帶引數。

其定義的一般形式為:

#define 識別符號 字串

其中的「#」表示這是一條預處理命令。凡是以「#」開頭的均為預處理命令。「define」為巨集定義命令。「識別符號」為所定義的巨集名。「字串」可以是常數、表示式、格式串等。

在前面介紹過的符號常量的定義就是一種無參巨集定義。此外,常對程式中反覆使用的表示式進行巨集定義。

例如:#define m (y*y+3*y)

它的作用是指定識別符號m來代替表示式(y*y+3*y)。在編寫源程式時,所有的(y*y+3*y)都可由m代替,而對源程式作編譯時,將先由預處理程式進行巨集代換,即用(y*y+3*y)表示式去置換所有的巨集名m,然後再進行編譯。

【例】#define m (y*y+3*y)

main()

上例程式中首先進行巨集定義,定義m來替代表示式(y*y+3*y),在s=3*m+4*m+5* m中作了巨集呼叫。在預處理時經巨集後該語句變為:

s=3*(y*y+3*y)+4*(y*y+3*y)+5*(y*y+3*y);

但要注意的是,在巨集定義中表示式(y*y+3*y)兩邊的括號不能少。否則會發生錯誤。如當作以下定義後:

#difine m y*y+3*y

在巨集時將得到下述語句:

s=3*y*y+3*y+4*y*y+3*y+5*y*y+3*y;

這相當於:

3y2+3y+4y2+3y+5y2+3y;

顯然與原題意要求不符。計算結果當然是錯誤的。因此在作巨集定義時必須十分注意。應保證在巨集代換之後不發生錯誤。

對於巨集定義還要說明以下幾點:

1) 巨集定義是用巨集名來表示一個字串,在巨集時又以該字串取代巨集名,這只是一種簡單的代換,字串中可以含任何字元,可以是常數,也可以是表示式,預處理程式對它不作任何檢查。如有錯誤,只能在編譯已被巨集後的源程式時發現。

2) 巨集定義不是說明或語句,在行末不必加分號,如加上分號則連分號也一起置換。

3) 巨集定義必須寫在函式之外,其作用域為巨集定義命令起到源程式結束。如要終止其作用域可使用# undef命令。

例如:#define pi 3.14159

main()

#undef pi

f1()

表示pi只在main函式中有效,在f1中無效。

4) 巨集名在源程式中若用引號括起來,則預處理程式不對其作巨集代換。

【例】#define ok 100

main()

上例中定義巨集名ok表示100,但在printf語句中ok被引號括起來,因此不作巨集代換。程式的執行結果為:ok這表示把「ok」當字串處理。

5) 巨集定義允許巢狀,在巨集定義的字串中可以使用已經定義的巨集名。在巨集時由預處理程式層層代換。

例如:#define pi 3.1415926

#define s pi*y*y /* pi是已定義的巨集名*/

對語句:

printf("%f",s);

在巨集代換後變為:

printf("%f",3.1415926*y*y);

6) 習慣上巨集名用大寫字母表示,以便於與變數區別。但也允許用小寫字母。

7) 可用巨集定義表示資料型別,使書寫方便。

例如:#define stu struct stu

在程式中可用stu作變數說明:

stu body[5],*p;

#define integer int

在程式中即可用integer作整型變數說明:

integer a,b;

應注意用巨集定義表示資料型別和用typedef定義資料說明符的區別。

巨集定義只是簡單的字串代換,是在預處理完成的,而typedef是在編譯時處理的,它不是作簡單的代換,而是對型別說明符重新命名。被命名的識別符號具有型別定義說明的功能。

請看下面的例子:

#define pin1 int *

typedef (int *) pin2;

從形式上看這兩者相似, 但在實際使用中卻不相同。

下面用pin1,pin2說明變數時就可以看出它們的區別:

pin1 a,b;在巨集代換後變成:

int *a,b;

表示a是指向整型的指標變數,而b是整型變數。

然而:pin2 a,b;

表示a,b都是指向整型的指標變數。因為pin2是一個型別說明符。由這個例子可見,巨集定義雖然也可表示資料型別, 但畢竟是作字元代換。在使用時要分外小心,以避出錯。

8) 對「輸出格式」作巨集定義,可以減少書寫麻煩。

【例】中就採用了這種方法。

#define p printf

#define d "%d\n"

#define f "%f\n"

main()

2 帶參巨集定義

c++語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數。

對帶引數的巨集,在呼叫中,不僅要巨集,而且要用實參去代換形參。

帶參巨集定義的一般形式為:

#define 巨集名(形參表) 字串

在字串中含有各個形參。

帶參巨集呼叫的一般形式為:

巨集名(實參表);

例如:#define m(y) y*y+3*y /*巨集定義*/

……k=m(5); /*巨集呼叫*/

……在巨集呼叫時,用實參5去代替形參y,經預處理巨集後的語句為:

k=5*5+3*5

【例】#define max(a,b) (a>b)?a:b

main()

上例程式的第一行進行帶參巨集定義,用巨集名max表示條件表示式(a>b)?a:b,形參a,b均出現在條件表示式中。

程式第七行max=max(x,y)為巨集呼叫,實參x,y,將代換形參a,b。巨集後該語句為:

max=(x>y)?x:y;

用於計算x,y中的大數。

對於帶參的巨集定義有以下問題需要說明:

1. 帶參巨集定義中,巨集名和形參表之間不能有空格出現。

例如把:

#define max(a,b) (a>b)?a:b

寫為:#define max (a,b) (a>b)?a:b

將被認為是無參巨集定義,巨集名max代表字串 (a,b) (a>b)?a:b。巨集時,巨集呼叫語句:

max=max(x,y);

將變為:

max=(a,b)(a>b)?a:b(x,y);

這顯然是錯誤的。

2. 在帶參巨集定義中,形式引數不分配記憶體單元,因此不必作型別定義。而巨集呼叫中的實參有具體的值。

要用它們去代換形參,因此必須作型別說明。這是與函式中的情況不同的。在函式中,形參和實參是兩個不同的量,各有自己的作用域,呼叫時要把實參值賦予形參,進行「值傳遞」。

而在帶參巨集中,只是符號代換,不存在值傳遞的問題。

3. 在巨集定義中的形參是識別符號,而巨集呼叫中的實參可以是表示式。

【例】#define sq(y) (y)*(y)

main()

上例中第一行為巨集定義,形參為y。程式第七行巨集呼叫中實參為a+1,是一個表示式,在巨集時,用a+1代換y,再用(y)*(y) 代換sq,得到如下語句:

sq=(a+1)*(a+1);

這與函式的呼叫是不同的,函式呼叫時要把實參表示式的值求出來再賦予形參。而巨集代換中對實參表示式不作計算直接地照原樣代換。

4. 在巨集定義中,字串內的形參通常要用括號括起來以避免出錯。在上例中的巨集定義中(y)*(y)表示式的y都用括號括起來,因此結果是正確的。如果去掉括號,把程式改為以下形式:

【例】#define sq(y) y*y

main()

執行結果為:

input a number:3

sq=7

C語言中的巨集定義如何使用,c語言巨集定義如何用?用巨集定義有什麼優點?

正確的完整輸出 3 個整數的程式結構應該按照如下寫法 define n 3 include int main for i 0 i n i 迴圈輸出整數陣列 a 中的 3 個數字,特別要注意 i 必須要寫成 i n,而不能夠寫成 i n,否則的話,就會產生越界錯誤。printf d t a i pri...

C 中的巨集定義是什麼,C 中,巨集定義與一般的定義有什麼區別?

向上爬的蝸牛 namespace 名字空間 名稱空間,一個程式可能由不同的人來寫,為了避免兩個人所寫的變數名衝突 同名 我們可以使用namespace 將自己要使用的庫函式或變數在該名字空間中定義的.避免了不必要的衝突了。c 標準程式庫中的所有識別符號都被定義於一個名為std的namespace中。...

C中如何定義全域性的巨集變數 define)

c 是純粹的面嚮物件語言.和c 與c完全不同.所以不要認為他們是相似的.如果要實現c 的全域性巨集定義可以建立一個類做為專門的設定類.在其它類中using這個類或者用同一個namespace 或者使用配置檔案configurationmanager來定義全域性變數.使用xml也行 如果是debug,...