[英]Taking macro argument inside a different macro in C
为什么这没有给出期望的输出? 对于Ex-取a = 1,b = 2,c = 3,d = 4它给出MAX4()= 2,但在这种情况下应为4。
#include<stdio.h>
#define MAX4(a,b,c,d) MAX2(MAX2(a,b),MAX2(c,d))
#define MAX2(a,b) a>b?a:b
int a,b,c,d;
int main(){
/*printf("Please enter 2 integers - \n");
scanf("%d %d",&a,&b);
printf("The maximum number among them is %d\n",MAX2(a,b));
*/
printf("Please enter 4 integers - \n");
scanf("%d %d %d %d",&a,&b,&c,&d);
printf("The maximum number among them is %d\n",MAX4(a,b,c,d));//,MAX2(a,b),MAX2(c,d));
return 0;
}
您需要添加括号以强制求值顺序:
#define MAX2(a,b) ((a)>(b)?(a):(b))
需要在参数周围MAX2(a + 1, b + 2)
括号以允许类似MAX2(a + 1, b + 2)
表达式。
宏只是进行文本替换。 因此, 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
宏,则可能仍然会遇到问题。
在您的宏中
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))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.