gpt4 book ai didi

c - 这两个宏max有什么区别?

转载 作者:行者123 更新时间:2023-11-30 20:19:39 25 4
gpt4 key购买 nike

写作leetcode我这样使用宏:

#define max(a,b) ((a) > (b))?(a):(b)

这是错误的,当我这样改变宏时,它是正确的

#define max(a,b) (((a) > (b))?(a):(b))

不明白为什么会这样。这是代码,你可以查看一下。

#define UNBALANCED 99

#define max(a,b) (((a) > (b))?(a):(b))
int getHeight(struct TreeNode * root)
{
if(NULL == root)
return -1;
int l = getHeight(root->left);
int r = getHeight(root->right);
if(UNBALANCED == l || UNBALANCED == r || abs(l-r) > 1)
return UNBALANCED;

return 1 + max(l,r);

}
bool isBalanced(struct TreeNode* root)
{
if(NULL == root)
return true;

return getHeight(root) != UNBALANCED;



}

这与 The need for parentheses in macros in C 不同

最佳答案

前者无法将宏替换与相邻操作数隔离。例如:

1 + max(a, b)

扩展为:

1 + ((a) > (b))?(a):(b)

分组为:

(1 + ((a) > (b))) ? (a) : (b)

则 (1 + ((a) > (b))) 始终非零,因此始终选择 (a)

为了防止这种情况,扩展为表达式的宏应该在整个表达式周围使用括号,以防止其部分与相邻操作数组合在一起。

关于c - 这两个宏max有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49471939/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com