c - 为什么宏的结果与 C 中的函数不同
问题描述
在下面的代码中,它用于获取二叉树的高度。以[1,2]作为输入,如果使用宏定义MAX,结果1是不正确的。使用函数 max 时,结果 2 是正确的。造成差异的原因是什么?
1
/
2
#define MAX(a,b) a>b?a:b
int max (int a, int b) {
return a>b?a:b;
}
int maxDepth(struct TreeNode* root){
if (root == NULL) return 0;
else {
int left = maxDepth(root->left);
int right = maxDepth(root->right);
return max(left, right) + 1;
//return MAX(left, right) + 1; // incorrect
}
}
解决方案
您不正确的表达式:return MAX(left, right) + 1;
将扩展为:
return left>right?left:right + 1;
添加一些括号来澄清错误:
return (left>right) ? (left) : (right + 1);
我认为您可以通过以下方式解决它:
#define MAX(a,b) ((a>b)?(a):(b))
但要小心!由于宏参数的双重评估,即使这也不适用于所有情况!
宏是个坏消息。
PS Roberto 询问了一个宏仍然不起作用的示例:
基本上,任何时候声明都会产生副作用。
#include <stdio.h>
#define MAX(a,b) ((a>b)?(a):(b))
int main(void)
{
int A = 3;
int B = 4;
printf("Bigger value is %d", MAX(2*A++, B) );
printf("A : %d\nB : %d\n", A, B);
return 0;
}
幼稚的阅读会表明这2*A++
将是6
,并留下A
价值4
(后增量)。但是,因为表达式在宏中2*A++
被计算了两次,所以宏返回8
并A
最终变成5
,代码中甚至还有未定义的行为。
推荐阅读
- android - 禁止键盘弹出
- android - 如何使用 Glide 管理本地 Bitmap?
- java - getDrawable 兼容性问题
- php - 如何在自定义方程式中使用占位符创建 pdo mysql 准备语句?
- ruby-on-rails - Rails 在嵌套形式中使用子值
- javascript - 如何删除 javascript eslint
- jquery - 如何使用 ajax 代码修复 jquery localhost 说对象对象错误
- html - 向 Bootstrap 导航栏添加字幕
- python - Jupyter Notebook 不在虚拟环境中使用包
- android - Kotlin - 碎片中的房间