首页 > 解决方案 > 此 C 代码的输出是 49,但有人可以解释一下吗?

问题描述

#include <stdio.h>

#define CUBE(x) (x * x * x)

int main() {
    printf("%d", CUBE(4+5));
    return 0;
}

标签: cc-preprocessor

解决方案


以下是宏在编译过程中的扩展方式:

printf("%d", (4+5 * 4+5 * 4+5));

因为*具有比 更高的优先级+,所以这个表达式被计算为(4 + (5 * 4) + (5 * 4) + 5),产生49而不是预期的729

为避免此类运算符优先级问题,所有宏参数必须在宏定义以及表达式本身中用括号括起来:

#define CUBE(x)  ((x) * (x) * (x))

但是请注意,这种扩展会CUBE计算x多次,如果宏参数具有副作用,例如CUBE(i++).

为避免所有这些问题,请使用函数并让编译器对其进行优化:

int cube(int x) {
    return x * x * x;
}

你可以static inline在这个函数定义之前添加,但是现代优化器仍然会在没有这个的情况下内联函数。


推荐阅读