2012-06-01 408 views
1

可能重複:
C Macros and use of arguments in parenthesesC語言編程宏乘法

我發現這個宏觀問題將是非常有趣的。

如果下面的代碼定義爲宏

#define MULT(x, y) x * y 

而且函數調用作出int z = MULT(3 + 2, 4 + 2);。 期望的輸出是3 + 2 = 5和4 + 2 = 6並且5 * 6爲30.

但是返回的輸出是13。 它將其作爲3 + 2 * 4 + 2。因此,根據運算符的優先級,它首先評估2 * 4。

這是什麼問題? 如果這些功能較小的功能哪一個更高效?定義函數或使用宏?

+2

這麼多重複... –

+0

你如何衡量效率?編碼時間,執行時間,可維護性... –

+0

該宏可能更有效。如果優化器內聯函數,它們可能是等價的。 –

回答

10

試着這麼做:

#define MULT(x, y) ((x)*(y)) 
+0

謝謝。但問題是更關心效率。 – Katti

+0

@Katti:這與效率有什麼關係? –

+0

爲什麼不使用'x * y'並跳過宏或函數呢? – aztaroth

0

試試這個:

#define MULT(x, y) ((x) * (y)) 

就個人而言,我認爲這是更具可讀性(和更少的按鍵),以使用宏。這是有人開始在學習新事物的過程中加入他們的代碼並在後來感到遺憾的事情。

+1

您仍然缺少括號。想象一下'z/MULT(x,y)' – Shahbaz