宏中的输出问题?
Output issue in Macros?
我有以下 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)));
}
为什么我得到 "result> 4, 2" 应该是 8 而不是 4?
由于这没有被否决或作为重复项关闭,我会尝试解释一下
让我们看看您的 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
宏调用,并删除不需要的括号,我们将得到以下内容
printf("result> %d, %d\n", 4 < f(3)? 4 : f(3), MIN_fix(4, f(3)));
所以我们在这行代码中调用了 3 次 f(3)
。对该函数的前三个调用 return 分别为 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
任何输出都是有效的 - 因为你有未定义的行为
我有以下 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)));
}
为什么我得到 "result> 4, 2" 应该是 8 而不是 4?
由于这没有被否决或作为重复项关闭,我会尝试解释一下
让我们看看您的 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
宏调用,并删除不需要的括号,我们将得到以下内容
printf("result> %d, %d\n", 4 < f(3)? 4 : f(3), MIN_fix(4, f(3)));
所以我们在这行代码中调用了 3 次 f(3)
。对该函数的前三个调用 return 分别为 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
任何输出都是有效的 - 因为你有未定义的行为