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
相关产品推荐
相关产品推荐

