#define sq(y) (y)*(y)上例中第一行為巨集定義,形參為y。程式第七行巨集呼叫中實參為a+1,是乙個表示式,在巨集展開時,用a+1代換y,再用(y)*(y) 代換sq,得到如下語句:main()
sq=(a+1)*(a+1);
這與函式的呼叫是不同的,函式呼叫時要把實參表示式的值求出來再賦予形參。而巨集代換中對實參表示式不作計算直接地照原樣代換。
#define sq(y) y*y
main()
執行結果為:
input a number:3
sq=7
同樣輸入3,但結果卻是不一樣的。問題在**呢? 這是由於代換只作符號代換而不作其它處理而造成的。巨集代換後將得到以下語句:
sq=a+1*a+1;
由於a為3故sq的值為7。
#define sq(y) (y)*(y)本程式與前例相比,只把巨集呼叫語句改為:main()
sq=160/sq(a+1);
執行本程式如輸入值仍為3時,希望結果為10。但實際執行的結果如下:
input a number:3
sq=160
為什麼會得這樣的結果呢?分析巨集呼叫語句,在巨集代換之後變為:
sq=160/(a+1)*(a+1);
a為3時,由於「/」和「*」運算子優先順序和結合性相同,則先作160/(3+1)得40,再作40*(3+1)最後得160。為了得到正確答案應在巨集定義中的整個字串外加括號,程式修改如下:
#define sq(y) ((y)*(y))main()
或者#define sq(y) ((y)*(y))
main()
點滴 巨集 引數加括號
define count x,y a b define count x,y a b 這兩者在 x 3 4 因為巨集替換其實就是文字的直接替換。least min p b 有問說這種會產生什麼區別?p b p b如果這兩者會有區別的話,是不是因為 和 的優先順序的問題?查了一下,果然是,這種題雖然說程...
帶引數的巨集定義
不是進行簡單的字串替換,還要進行引數替換。其定義的一般形式為 define 巨集名 參數列 字串 字串中包含在括弧中所指定的引數。如 define s a,b a b area s 3,2 定義矩形面積s,a 和 b 是邊長。在程式中用了s 3,2 把3 2分別代替巨集定義中的形式引數a b,即用 ...
define 巨集名帶引數
c語言允許巨集帶有引數。在巨集定義中的引數稱為形式引數,在巨集呼叫中的引數稱為實際引數,這點和函式有些類似。對帶引數的巨集,在呼叫中,不僅要巨集展開,而且要用實參去代換形參。帶參巨集定義的一般形式為 在字串中含有各個形參。帶參巨集呼叫的一般形式為 巨集名 實參列表 例如 code k m 5 巨集呼...