在C ++中使用预处理器时的输出

时间:2015-09-12 19:25:08

标签: c++ c-preprocessor

这里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);
}

2 个答案:

答案 0 :(得分:4)

宏调用

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")会发生什么,你可能会得到难以追踪的奇怪错误。)< / p>

答案 1 :(得分:0)

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

尝试使用括号来达到你想要的效果。