2016-02-10 43 views
2

何時需要將括號中的整個(右)表達式放在括號中?定義宏的括號

如果我這樣做

#define SUM(x, y) ((x)+(y)) 

我必須把正確的表達成括號,因爲「+」擁有℃時的低優先級(如果我將在使用它,它不會工作以下內容SUM(x, y) * 5U

如果我使用最高優先級的運算符,這些括號是否仍然需要

#define F foo() 

甚至

#define ACCESS(x, y) (x)->(y) 

是否表達存在,這將打破,因爲它會爲SUM()例如做實際的意義呢?)

爲我所用http://en.cppreference.com/w/c/language/operator_precedence

優先規則
+4

我不知道*必要*,但我仍然稱它爲好習慣。如果某人(比如說)爲'f'宏添加一個修正因子來(不管)規範化'foo'的輸出,並忘記添加括號?你會花很多時間去弄清楚出了什麼問題。 – Linuxios

回答

2

使用括號避免一些大錯誤是一個很好的做法。目前,您可能認爲您的運營商具有高優先級,但假設您正在製作代碼的頭文件並將其交給您的朋友,該朋友使用該文件中的宏,並且該函數具有更高的優先級,因此當時它將是調試代碼非常痛苦。您可以通過放置括號將這段時間保存爲程序員。

+0

我的問題是,何時*必須*將括號括在宏中。當然,如果運營商的優先級低,例如「+」,則總是需要括號(如SUM示例中所示)。但是具有高優先級的表達式如「 - >」,「++」,「[]」,「。」 ? – ZzetT

+0

我想我找到了一個很好的例子,它說明了爲什麼「使用括號避免一些大錯誤是一個好習慣。」並不總是對的!想象一下你有一個'#define foo()','foo'被定義爲'do {} while(0)',那麼這將不再編譯! – ZzetT

1

使用簡單的#define一些程序員會寫

#define ZERO (0) 

這並不比複雜的東西其他用途。

其實宏是所見即所得所以考慮到這一點,你可以決定需要什麼樣的括號:

SUM(3,4) => ((3)+(4)) // parentheses around 3 and 4 are not necessary 

RATIO(3+4,4+5) => ((3+4)/(4+5)) // probably necessary here due to operator precedence 

它不是火箭科學摸不着頭腦,它實際上是非常簡單的。

+0

我認爲這不能回答我的問題,你只是解釋瞭如何用C來評估宏。 – ZzetT

+0

是的,這就是我所做的。您是否認爲宏中的括號與其他C語句中的括號不同? –