【问题标题】:Output when using Pre-processors in C++ [duplicate]在 C++ 中使用预处理器时的输出 [重复]
【发布时间】:2015-09-12 19:25:07
【问题描述】:

这里 f(3+3) 替换为 f(6)= 6*6 ? 所以输出应该是36 na?那么为什么和如何答案是 15?

 #include <iostream>
 #define f(a) a*a
 using namespace std;
 int main(){
cout<<f(3+3);
}

【问题讨论】:

  • 运算符优先级和缺少括号。预处理器只是进行简单的文本替换。考虑一下结果。
  • 不要在 C++ 中使用宏 - 问题已解决。 int f(int a) { return a*a; } 而不是您的宏将正常工作
  • @AlanStokes 这仅适用于 C,至少在这种情况下是这样。
  • @πάνταῥεῖ 同意。我差点把inline 放在那里,但它是一个如此简单的例子,它不需要。
  • 这是为什么宏是邪恶的一个例子。我强烈建议你改用内联函数。

标签: c++ c-preprocessor


【解决方案1】:

宏调用

f(3 + 3)

被替换为

3 + 3 * 3 + 3

这就是宏的参数通常放在括号之间的原因:

#define f(a) (a) * (a)

附带说明,如果您使用变量而不是文字整数,并执行类似

int a = 3;
int result = f(a++);

然后宏被替换为

(a++) * (a++)

导致a 增加两次以未知的顺序,导致未定义的行为

在 C++ 中,几乎不再使用类似函数的宏,而且由于它们存在的所有问题(如上所示),您真的不应该使用它们。使用函数,它们行为正确,编译器仍然可以内联它们,并且它们是类型安全的(想想如果你这样做会发生什么,例如f("3"),你可能会遇到难以追踪的奇怪错误)。

【讨论】:

  • 你也忘了给结果加上括号。#define f(a) ((a) *(a))
【解决方案2】:

因为 3 + 3 × 3 + 3 = 15。

尝试使用括号来实现你想要的。

【讨论】:

    猜你喜欢
    • 2021-12-17
    • 2011-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-14
    • 2012-02-17
    相关资源
    最近更新 更多