宏中的输出问题?

时间:2016-10-21 18:00:31

标签: c macros output-parameter

我有以下C代码:

#include <stdio.h>

int x = 2;
int f (int z) { int temp = x; x += 2*z; return temp; }

#define MIN(X,Y)  ((X) < (Y) ? (X) : (Y))  /* side effects may cause error */
int MIN_fix(X,Y) { if (X < Y) return X; else return Y; }

int main () {
unsigned char b = 0x3, c = 0x1;
printf("result> %d, %d\n", MIN(b+c, f(3)), MIN_fix(b+c, f(3)));
}

为什么我得到“结果&gt; 4,2”应该是8而不是4?

1 个答案:

答案 0 :(得分:0)

由于这并没有被投票或作为副本关闭,我会尝试解释

让我们看一下你的printf电话:

printf("result> %d, %d\n", MIN(b+c, f(3)), MIN_fix(b+c, f(3)));

现在b+c实际上是一个常数值(4),因此变为

printf("result> %d, %d\n", MIN(4, f(3)), MIN_fix(4, f(3)));

如果我们扩展MIN宏调用,并删除不需要的parens,我们会得到以下内容

printf("result> %d, %d\n", 4 < f(3)? 4 : f(3), MIN_fix(4, f(3)));

所以我们在这行代码中有3次调用f(3)。对该函数的前三次调用分别返回2,8和14。但是无法保证这些调用的评估顺序。

设f1 = 2,f2 = 8,f3 = 14。您的printf可以是以下任何一种,其输出在评论中

printf(..., 4<f1?4:f2, MIN_fix(4,f3)); //  8, 4
printf(..., 4<f1?4:f3, MIN_fix(4,f2)); // 14, 4
printf(..., 4<f2?4:f1, MIN_fix(4,f3)); //  4, 4
printf(..., 4<f2?4:f3, MIN_fix(4,f1)); //  4, 2
printf(..., 4<f3?4:f1, MIN_fix(4,f3)); //  4, 4 
printf(..., 4<f3?4:f2, MIN_fix(4,f1)); //  4, 2

任何输出都有效 - 因为您有未定义的行为