2010-09-15 50 views
9

我只是經歷了一些在訪談中經常被問到的代碼。我想出了一些問題,如果有人能幫我解決這個問題?使用#define定義的數字的正方形

我對這個現在完全糊塗了,

#include <stdio.h> 
#include <conio.h> 

#define square(x) x*x 

main() 
{ 
     int i, j; 
     i = 4/square(4); 
     j = 64/square(4); 
     printf("\n %d", i); 
     printf("\n %d", j); 
     printf("\n %d", square(4)); 
     getch(); 
} 

輸出是:

4 
64 
16 

我很納悶,爲什麼square(4)返回1,當我分吧?我的意思是,當我對它進行分割時,如何獲得值4和64,但直接使用時,我得到 !!?

+1

只要注意#define square(x)x * x是一個clasic C baddy。嘗試使用方形(x ++)循環; – Jaydee 2010-09-15 15:33:50

+5

如果你真的想迷惑自己,而且還沒有閱讀任何答案,請嘗試用'square(3 + 1)'替換'square(4)'。 – JeremyP 2010-09-15 15:40:55

+0

這是一個簡單的優先問題。 – 2010-10-08 21:42:46

回答

26

square是欠括號:它以文本方式膨脹,所以

#define square(x) x*x 
    ... 
i=4/square(4); 

裝置

i=4/4*4; 

其中基團作爲(4/4) * 4。要解決,加上括號:

#define square(x) ((x)*(x)) 

仍然是一個非常玄乎#define,因爲它計算x的兩倍,因此square(somefun())調用函數兩次,確實因此一定計算正方形,而是兩個連續通話的產品,當然;-)。

+0

yea ..知道了..正在爲它而生氣.. – 2010-09-15 15:47:41

+3

+1 for'square(somefun())'。在這種情況下,通常觀察到的副作用是兩次,但如果你想象一下'square(rand())',你將得到兩個隨機數的乘積,而不是一個隨機數的平方。 – RBerteig 2010-09-15 18:42:31

2

運算符優先級正在傷害你。

宏是由預處理器這樣擴大了

i=4/4*4; 
    j=64/4*4; 

這相當於:

i=(4/4)*4; 
    j=(64/4)*4; 
1

j = 4/square(4) == 4/4*4 == 1*4 == 4

4

當你寫i=4/square(4),預處理器擴展,爲i = 4/4 * 4
因爲C從左到右分組操作,編譯器將其解釋爲i = (4/4) * 4,這相當於1 * 4

您需要添加括號,就像這樣:

#define square(x) ((x)*(x)) 

這樣,i=4/square(4)變成i = 4/((4) * (4))
如果您編寫square(1 + 1),則需要在x附近使用其他括號,否則該編號會變爲1 + 1 * 1 + 1,該值將被評估爲1 + (1 * 1) + 13

3
i=4/square(4); 

擴展到

i=4/4*4; 

這相當於

i=(4/4)*4; 
0

手動擴大在代碼中宏,這將是明顯的。也就是說,用x * x替換所有的square(x),特別是不要添加任何括號。

0

定義僅僅是宏觀

main() 
{ 
     int i,j; 
     i=4/ 4 * 4; // 1 * 4 
     j=64/4 * 4; // 16 * 4 
     printf("\n %d",i); 
     printf("\n %d",j); 
     printf("\n %d",square(4)); 
     getch(); 
} 
0

這是一個宏觀文本!所以它會返回,它正好代替

i = 4/4*4; Which is 4... 
j = 64/4*4; Which is 16... 

嘗試此宏:

#define square(x) ((x)*(x)) 
0

因爲在預處理後表達運算符優先級的 - 你需要編寫

#define square(x) (x*x) 
0

至於其他的答案說,你被運營商優先權燒燬。將您的方形宏更改爲:

#define square(x) (x*x) 

它會以您期望的方式工作。

2

這是因爲編譯器代替它:

i=4/4*4; 
j=64/4*4; 

I =(4/4)* 4 = 1×4 = 4。

J =(64/4)* 4 = 16 * 4 = 64.