首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用宏作为更大的数学表达式的一部分时,会导致不正确的输出-为什么会发生这种情况?

使用宏作为更大的数学表达式的一部分时,会导致不正确的输出-为什么会发生这种情况?
EN

Stack Overflow用户
提问于 2010-01-22 12:58:08
回答 13查看 425关注 0票数 6

这是一个普通的C程序,我在一些题库中发现的。如下图所示:

代码语言:javascript
复制
#define CUBE(p) p*p*p

main()
{
    int k;
    k = 27 / CUBE(3);
    printf("%d", k);
}

根据我的理解和知识,K的值应该是1,因为在预处理过程中,CUBE(3)会被3*3*3替换,在随后的编译之后,它会给出1的值,但它显示的值是81,这让我很好奇它是如何发生的。

对于上面这个问题,谁能证明81的答案是正确的?

EN

回答 13

Stack Overflow用户

回答已采纳

发布于 2010-01-22 13:01:25

预处理器应该正确地用括号括起来。将其替换为

代码语言:javascript
复制
#define CUBE(p) ((p)*(p)*(p))

然后你看。

票数 3
EN

Stack Overflow用户

发布于 2010-01-22 13:00:50

预处理器仅替换为

代码语言:javascript
复制
CUBE(3)

使用

代码语言:javascript
复制
3*3*3

所以你最终会得到:

代码语言:javascript
复制
k=27/3*3*3

从左到右按运算符优先级计算,实际上是81。

如果在宏两边添加括号,您会发现结果是正确的:

代码语言:javascript
复制
#define CUBE(p) (p*p*p)

更好的做法是用括号将每个p实例括起来,如:

代码语言:javascript
复制
#define CUBE(p) ((p)*(p)*(p))

这将允许您将表达式正确地传递给宏(例如,1 + 2)。

票数 15
EN

Stack Overflow用户

发布于 2010-01-22 13:07:39

由于运算符优先级而导致的 27/3*3*3 = 81

您可以使用:

代码语言:javascript
复制
inline int cube(int p) { return p*p*p; }
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2115095

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档