1樓:匿名使用者
首先,這個執行結果是正常的,是你在寫巨集定義的時候不太規範,解決方法:
在巨集定義裡把用到的所有的巨集引數都加上括號
比如第二個改成:#define m(x,y,z) (x)*(y)+(z)
第三個改成:#define m(x) (x)*((x)-1)
這樣的話程式就是按你想的方式執行了
原理:#define的功能
#define 是預編譯指令,它相當於程式設計師與編譯器間的一個協議,用#define可以定義很多東西,包括簡短的**段(長**段也可以,就是麻煩點)。當出現「#define a b」這樣的巨集定義後,編譯器編譯程式前會把**中所有出現的a換成b再進行編譯,就是說#define的功能相當於就是語句(字串)替換,巨集裡用到的引數也只是語句替換,而不是語句值的替換。具體點,舉你說的例子
對於m(x,y,z) x*y+z,當編譯器遇到m(a+b,b+c,c+a)這樣的巨集時,會將它成 a+b * b+c + c+a,就是直接把a+b這個語句放到x的位置,把b+c這個語句放到y的位置,把c+a這個語句放到z的位置,而不是將a+b這個整體的值當做x的值再代入到x*y+z中運算,這點跟函式呼叫是不一樣的。這樣的話( a+b * b+c + c+a ),程式執行起來就是先算b*b的值,再算剩下的加法,最後得到的值就是 1+2*2+3+3+1=12。
而在巨集定義裡的引數上加上括號後,比如:#define m(x,y,z) (x)*(y)+(z),這樣m(a+b,b+c,c+a)預編譯後就是 (a+b) * (b+c) + (c+a),這樣結果就想你想的那樣了。
2樓:聞凝春秀華
#define
m(x,y,z)
x*y+z
此巨集時不能自行加括號,直接原形即可
由int
a=1,b=2,c=3;
得m(a+b,b+c,c+a)=a+b*b+c+c+d=1+2*2+3+3+1=12
3樓:匿名使用者
牢記:#define操作只是簡單地作文字替換,所以在有操作符存在的時候一定要注意加括號。
1. #define min(x,y) (x)<(y)?(x):(y)
應該改成#define min(x,y) ((x)<(y)?(x):(y))
2.#define m(x,y,z) x*y+z
應該改成#define m(x,y,z) ((x)*(y)+(z))
3.#define m(x) x*(x-1)
應該改成#define m(x) ((x)*(x-1))
加了括號以後,可以防止「呼叫」時產生的運算子優先順序出錯。建議樓主養成加括號的好習慣。
4樓:小何才露尖尖角兒
#define 是,是替換**。比如最後一個m(1+a+b),就是1+a+b*(1+a+b-1) == 8
5樓:闊海的賬戶
第一個定義:
#define min(x,y) (x)<(y)?(x):(y)
int i=10,j=15,k;
k=10*min(i,j)實際上被編譯成:k = 10*(i)<(j)?(i):(j)
而10*i=100 大於 j=10,所以k=j=15;
如果想得出期望的結果,應該這樣寫:k=10*(min(i,j));
第二個定義:
#define m(x,y,z) x*y+z
int a=1,b=2,c=3;
m(a+b,b+c,c+a)被編譯成: m= a+b*b+c+c+a =1+2*2+3+3+1 = 12;
如果想要得到期望的結果,應該這樣定義:#define m(x,y,z) (x)*(y)+(z)
第三個定義:
#define m(x) x*(x-1)
int a=1,b=2;
m(1+a+b)被編譯成: m= 1+a+b*(1+a+b-1) =1+1+2*(1+1+2-1) = 8
如果想要得到期望的結果,應該這樣定義:#define m(x) (x)*(x-1)
6樓:匿名使用者
第一個k=10*10<15?10:15
所以k=15;
第二個m=1+2*2+3+3+1=12
第三個m=1+1+2*(1+1+2-1)=8
關於c語言#define的問題
7樓:匿名使用者
#define fn "hello world!"
printf(fn);
巨集不要再雙引號裡使用。
關於c語言的問題,關於C語言的問題。
題1 include int main 題2 include int main 題3 include int main 第1個題目 就是判斷while 括號裡面的值是否為真,因為加了個!所以 k 0 n 為真時while裡面的判斷語句就為假,因為 為邏輯與,就是判斷 兩邊的式子是否為真,當k 0為真...
C語言小問題,關於,關於C語言的小問題?
a b max a max b 語法錯誤,該為 a b max a max b 另外注意 printf 最大值為 c n c 改正為printf 最大值為 d n c 已測試關於i 和 i的區別,如果沒有賦值的話,他們結果是沒區別的,關於他們的區別,我舉例說明 1 int i 0,a a i 這裡結...
c語言中,define命令是什麼意思
巨集定義在編譯的時候將你定義的符號全部轉換為你定義的值比如說 define aa 123 pirntf d aa 編譯的時候編譯器會自動將 變成printf d 123 c語言中,define命令是什麼意思 define是c語言中的預處理命令,它用於巨集定義,可以提高源 的可讀性,為程式設計提供方便...