为什么这不能提供所需的输出?对于Ex - 取a = 1,b = 2,c = 3,d = 4它给出MAX4()= 2,而在这种情况下它应该是4。
id="id_of_angular_content"
答案 0 :(得分:3)
您需要添加括号以强制执行评估顺序:
#define MAX2(a,b) ((a)>(b)?(a):(b))
需要围绕参数的额外括号以允许使用MAX2(a + 1, b + 2)
等表达式。
答案 1 :(得分:3)
宏只是做文本替换。所以MAX4
调用首先在其参数中展开宏,给出
MAX2(a>b?a:b,c>d?c:d)
然后扩展到
a>b?a:b>c>d?c:d?a>b?a:b:c>d?c:d
当编译器然后解析扩展的宏时,>
(高于?:
)的优先级导致这不符合您的预期。在宏中使用额外的括号可以避免优先级问题,但如果在带有副作用的表达式上调用MAX2
宏,则可能仍会出现问题。
答案 2 :(得分:2)
在你的宏中
MAX4(a,b,c,d);
如果a = 1,b = 2,c = 3,d = 4则宏变为
MAX4(1,2,3,4);
反过来会成为
MAX2(MAX2(1,2),MAX2(3,4))
因此评估为
MAX2(1>2?1:2,3>4?3:4)
即
1>2?1:2>3>4?3:4?1>2?1:2:3>4?3:4
并根据运算符优先级和关联性得到2而不是4。
为了获得4,你应该使用
#define MAX2(a,b) ((a)>(b)?(a):(b))