什么时候必要将定义宏的整个(右)表达式放在括号中?
如果我做的话
#define SUM(x, y) ((x)+(y))
我必须将正确的表达式放入括号中,因为" +"在C中具有较低的优先级(如果我将在以下上下文SUM(x, y) * 5U
中使用它,它将无法工作)
如果我使用具有最高优先级的运算符,例如
,是否仍需要这些括号#define F foo()
甚至
#define ACCESS(x, y) (x)->(y)
是否存在会破坏实际意义的表达式,就像它对SUM()
示例所做的那样?)
对于我使用http://en.cppreference.com/w/c/language/operator_precedence
的优先规则答案 0 :(得分:2)
使用括号避免一些大错误是一个好习惯。目前您可能认为您的运算符具有较高的优先级,但假设您正在制作代码的头文件并将其提供给您的朋友,该朋友使用该文件中的宏,该函数具有更高的优先级,因此当时它将是一个调试代码非常痛苦。您可以通过括号将这段时间保存为程序员。
答案 1 :(得分:1)
一些使用简单#defines的程序员会写
#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
这不是解决这个问题的火箭科学,实际上非常简单。