You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C转Java:解析C语言宏运算陷阱——ADD(1,2)*3为何结果为7?

问题解析:C宏ADD(1,2)*3为何结果是7而非9?

C代码示例

#define ADD(a, b) a + b

// example function
void foo()
{
  int i = ADD(1, 2); // add two ints
  double d = //doubles
    ADD(3.4, 5.6);

  int sly = ADD(1, 2) * 3; // not what it appears to be
}

Java代码示例

package demo;

public class DemoTranslation {
    public static int add(int a, int b) {
        return a + b;
    }

    public static double add(double a, double b) {
        return a + b;
    }

    /**
     * example function
     */
    public static void foo() {
        int i = add(1, 2); // add two ints
        double d = /* doubles */ add(3.4, 5.6);

        int sly = 1 + 2 * 3; // not what it appears to be
    }
}

原因解析

C语言的宏定义是纯文本替换,不是函数调用。当编译器处理ADD(1, 2) * 3时,会直接把宏展开成:

1 + 2 * 3

而C语言中乘法*的优先级高于加法+,所以会先计算2*3=6,再算1+6=7,最终结果就是7。

如果想让宏的行为和函数一致,需要给宏的表达式加上括号,修改后的宏定义应该是:

#define ADD(a, b) (a + b)

这样展开后会变成(1 + 2) * 3,先算括号里的加法得到3,再乘3得到预期的9。

而Java里的add是真正的函数调用,会先执行add(1,2)得到3,再和3相乘得9,但示例里Java代码直接写了1+2*3,所以结果也是7,和C宏展开后的计算逻辑一致。

内容的提问来源于stack exchange,提问作者DCR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 16:41:02