2013-12-10 75 views
3

有人可以向我解釋爲什麼這裏y的值是13嗎?在方程中使用#define

#include <stdio.h> 
#define avg_sum(n) n * (n-1)/2 
int main(){ 
    int y; 
    int z = 9; 
    y = avg_sum(z+1); 
    printf("y=%i\n",y); 
} 
+2

這就是爲什麼你總是使用周圍宏參數括號時,他們是一個算術表達式的一部分,和括號周圍的宏體作爲一個整體,也使'934/avg_sum(12)'給你期待也回答。 –

回答

3

回答這些各種各樣的問題,最好的辦法是簡單地擴大宏問題:

y = avg_sum(z+1); 

y = z + 1 * (z + 1 - 1)/2 

y = 9 + 1 * (9 + 1 - 1)/2 

y == 13 

這就是爲什麼你周圍添加您的宏參數括號。

#define avg_sum(n) ((n) * ((n)-1)/2) 
6
avg_sum(9+1) 9+1 * (9+1-1)/2 = 9 + 9/2 = 9+ 4 = 13 

宏每一次擴張,使得9 + 1是不一樣的10,它如下可能會更好地維護括號:

#define avg_sum(n) ((n) * ((n)-1)/2) 

而是equivelant 功能會做你更好,更直觀,只會評價一次參數

avg_sum(a++)將會是((a++) * ((a++)-1)/2),將增加a而兩次被調用的函數

之前
+2

+1因爲你建議使用函數 – Mpac

+1

'static int inline int avg_sum(int n){return(n *(n-1))/ 2; }'很好地工作,除非你堅持使用陳舊的C90編譯器(例如Windows,MSVC上的默認設置)。 –

+0

@JonathanLeffler在函數版本中,我不確定你需要所有的父母 –

2
y = avg_sum(z+1); 

擴展到z + 1 * (z+1-1)/2但它是錯的功能將不會有這些問題,因爲所有的參數都是evaulated。將您的宏更改爲

#define avg_sum(n) ((n) * ((n)-1)/2) 

並且始終將函數宏的參數與括號一樣用括號括起來。這是一條重要的規則。