c - 此 C 代码的输出是 49,但有人可以解释一下吗?
问题描述
#include <stdio.h>
#define CUBE(x) (x * x * x)
int main() {
printf("%d", CUBE(4+5));
return 0;
}
解决方案
以下是宏在编译过程中的扩展方式:
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
在这个函数定义之前添加,但是现代优化器仍然会在没有这个的情况下内联函数。
推荐阅读
- excel - Excel 中的条件格式。查找列之间的不匹配值
- c# - 无法将 Json 反序列化为类型,无法找到构造函数
- c - 如何使用 crypt() 函数获取十六进制哈希?
- php - 如何对实体进行动态setmethod数据?
- node.js - 我无法解决 Node.js installDebug 错误。我该怎么办?
- powershell - 基本循环帮助 - Powershell
- android - 在 Application 中获取 MainActivity 的引用
- ipfs - IPFS 专用网络设置不起作用
- amazon-web-services - Vue单元测试-ReferenceError:App.vue中未定义AWS
- windows - Windows在卸载软件时如何找到安装位置