有人可以向我解釋爲什麼這裏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);
}
有人可以向我解釋爲什麼這裏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);
}
回答這些各種各樣的問題,最好的辦法是簡單地擴大宏問題:
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)
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
而兩次被調用的函數
+1因爲你建議使用函數 – Mpac
'static int inline int avg_sum(int n){return(n *(n-1))/ 2; }'很好地工作,除非你堅持使用陳舊的C90編譯器(例如Windows,MSVC上的默認設置)。 –
@JonathanLeffler在函數版本中,我不確定你需要所有的父母 –
y = avg_sum(z+1);
擴展到z + 1 * (z+1-1)/2
但它是錯的功能將不會有這些問題,因爲所有的參數都是evaulated。將您的宏更改爲
#define avg_sum(n) ((n) * ((n)-1)/2)
並且始終將函數宏的參數與括號一樣用括號括起來。這是一條重要的規則。
這就是爲什麼你總是使用周圍宏參數括號時,他們是一個算術表達式的一部分,和括號周圍的宏體作爲一個整體,也使'934/avg_sum(12)'給你期待也回答。 –