C 語言帶參巨集定義和函式的區別

2021-09-10 08:41:09 字數 1197 閱讀 8767

帶參的巨集和帶參函式很相似,但有本質上的不同,把同一表示式用函式處理與用巨集處理

的結果有可能是不同的。

【示例①】用函式計算平方值。

1. #include 2.

3. int sq(int y)

6.7. int main()

12. return 0;

13. }

執行結果:

1^2 = 1

2^2 = 4

3^2 = 9

4^2 = 16

5^2 = 25

【示例②】用巨集計算平方值。

1. #include 2.

3. #define sq(y) ((y)*(y))

4.5. int main()

10. return 0;

11. }

vc 6.0 下執行結果:

1^2 = 1

3^2 = 9

5^2 = 25

c-free(mingw)下執行結果:

3^2 = 1

5^2 = 9

7^2 = 25

之所以出現不同的結果,與 printf() 引數列表中表示式的計算順序和優先順序有關,這

裡不再深究。

分析如下:在示例①中,函式呼叫是把實參 i 值傳給形參 y 後自增 1,然後輸出函式

值,所以要迴圈 5 次,輸出 1~5 的平方值。而在示例②中巨集呼叫時只作代換,sq(i++) 被

代換為 ((i++) * (i++))。第一次迴圈,i 的值為 1,(i++) * (i++)=1;第二次迴圈 i 的值為 3,

(i++) * (i++)=9;第三次迴圈 i 的值為 5,(i++) * (i++)=25;第四次迴圈,i 的值為 7,終

止迴圈。

從以上分析可以看出函式呼叫和巨集呼叫二者在形式上相似,在本質上是完全不同的。

巨集定義也可用來定義多個語句,在巨集呼叫時,把這些語句又代換到源程式內。看下面的

例子。

1. #include 2. #define sssv(s1, s2, s3, v) s1=l*w; s2=l*h; s3=w*h; v=w*l*h;

3. int main()

執行結果:

sa=12

sb=15

sc=20

vv=60

C之帶參巨集定義

1.帶參巨集定義跟前面文章有所區別,不是簡單的數值或者字串替換,是要進行引數替換。2.本人理解,帶參巨集是很方便的,一些固定輸入和輸出咱們可以選擇帶參巨集,類似工程中多出要計算兩數相乘,這種情況我們就可以使用帶參巨集。define s a,b a b qdebug 2,3 6 define pi 3...

帶參巨集定義的思考

帶有引數的巨集定義 巨集定義是一種替換,所以返回的通常是帶有運算子表示式.不能返回語句.通常用的一些運算子 三目運算子 代替if語句 特殊建議 為了保證準確性,在 中放入變數 下面是一些巨集定義的例子 1,判斷字元是不是10進 值的 數字 define decchk c c 0 c 9 2,判斷字元...

C語言巨集定義和巨集定義函式

c語言巨集定義和巨集定義函式 巨集定義可以幫助我們防止出錯,提高 的可移植性和可讀性等。在軟體開發過程中,經常有一些常用或者通用的功能或者 段,這些功能既可以寫成函式,也可以封裝成為巨集定義。那麼究竟是用函式好,還是巨集定義好?這就要求我們對二者進行合理的取捨。我們來看乙個例子,比較兩個數或者表示式...