【问题标题】:#define in C: what is happening [closed]#define in C:发生了什么[关闭]
【发布时间】:2020-04-28 23:11:47
【问题描述】:

谁能解释每一步发生了什么? 我知道最终输出是 140.5,但我不确定为什么会这样。导致 140.5 的每一行发生了什么?

#define PI 3.1
#define calcCircleArea(r) (PI * (r) * (r))
#define calcCylinderArea(r,h) (calcCircleArea(r) * h)
int main() {
    double i = calcCylinderArea(3.0,5.0 + 1); printf("%g", i);
}

【问题讨论】:

  • 运行cc -E -o preprocessed.c source.c 并查看结果。
  • 首先记住(或了解)宏在编译时被扩展。基本上发生的事情是宏“调用”被宏的主体取代。现在要了解发生了什么,请尝试自己一个一个地扩展宏,直到你有一个非宏表达式。请注意,大多数编译器都可以选择为您执行此操作(向您显示预处理文件)。
  • 你有一个错误:因为calcCylinderArea 是一个CPP ,并且因为你将5.0 + 1 传递给h,[其中x 是@987654327 @ ...]你会[有效地]得到(x * 5.0) + 1而不是(x * (5.0 + 1),这就是你想要的。这是因为乘法比加法具有更高的优先级,因此将首先执行乘法,然后然后将对其应用加法。在h 周围添加括号[就像您在calcCircleArea 中为r 所做的那样。即:#define calcCylinderArea(r,h) (calcCircleArea(r) * (h))
  • 感谢您的所有 cmets!我知道这段代码不是很好,并且有一个错误。我不是在寻找解决办法,而是更多地从概念上理解正在发生的事情。相反,我试图了解在此过程中每个级别都发生了什么(我是#define 的新手)。感谢您的 cmets 和您的帮助:)

标签: c area


【解决方案1】:

步骤 0

calcCylinderArea(3.0,5.0+1)

第一步

(calcCircleArea(3.0)*5.0+1)

注意不是(5.0+1)
问题从这里开始。

第 2 步

((PI*(3.0)*(3.0))*5.0+1)

第三步

((3.1*(3.0)*(3.0))*5.0+1)

【讨论】:

  • 请不要编辑。
  • @zwol 谢谢你的建议。您评论的是“另一个示例”部分吗?如果是,我会修复它并避免再次这样做。
  • 是的,这就是我所指的。
【解决方案2】:

calcCylinderArea(3.0,5.0 + 1) 被计算为: calcCircleArea(3.0) * 5.0 + 1 计算为: PI * 3.0 * 3.0 * 5.0 + 1 即 140.5

乘法先于加法

要解决此问题,请将行更改为: calcCylinderArea(3.0,(5.0 + 1)) 以便先完成添加。

【讨论】:

  • 应该修改的是宏定义,而不是调用点。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 1970-01-01
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2018-02-22
相关资源
最近更新 更多