#include <iostream>
using namespace std;
#define squareOf(x) x*x
int main() {
// your code goes here
int x;
cout<<squareOf(x+4);
return 0;
}
我以为答案会是16,但答案是4。 我很困惑这是如何工作的。
答案 0 :(得分:6)
16永远不会是这里的结果。假设您将x初始化为0,然后将x + 4替换为x + 4 * x + 4,其结果为0 + 4 * 0 + 4 = 4。
预处理器宏替换源代码,它们是不是函数。
您现在可能会认为
#define squareOf(x) (x)*(x)
会更好,但是请考虑
int x = 2;
int y = squareOf(x++);
将导致y =(2)*(3)= 6,而不是4。
如果您没有很好的理由,请避免使用 预处理程序宏。有充分的理由,但是如果某些东西的行为类似于函数,则最好使其成为函数。
现在来看一下:
template <class T>
inline T squareOf(const T& number)
{
return number*number;
}
作为内联,它也确实会替换代码(至少在编译器需要的情况下),但是在这里,此代码实际上就像一个函数(因为它是一个函数)。不会期望那个结果会很糟糕。