HI,

有人能帮助我理解为什么SQUARE(X)的值是49?

我使用Visual C ++ 6.0。

#define SQUARE(X) X * X

int main(int argc, char* argv[])
{
    int y = 5;

    printf("%d\n",SQUARE(++y));
    return 0;
}
有帮助吗?

解决方案

尼尔巴特沃斯,马克和Pavel是正确的。

SQUARE(++ Y)扩展到++ Y * ++ Y,其中递增Y的值的两倍。

可能会遇到的另一个问题是:SQUARE(A + B)扩展为A + B * A + B,其不是(A + B)*(A + B)但+(B * A)+ B。你应该采取必要的时候,而宏定义元素周围添加括号的护理:#定义SQUARE(X)((X)*(X))是少了几分危险。 (伊恩·肯普在他的评论中第一次写吧)

您可以替代使用内联模板函数(无在运行时效率较低)像这样的:

template <class T>
inline T square(T value)
{
    return value*value;
}

您可以检查它的工作原理:

int i = 2;
std::cout << square(++i) << " should be 9" << std::endl;
std::cout << square(++i) << " should be 16" << std::endl;

(没有必要写

square<int>(++i)

因为int类型是隐含的对于i)

其他提示

由于该宏扩展为:

++y * ++y

其给出在C ++未定义行为 - 其结果可能 是什么。这是众所周知的问题应该在覆盖使用宏任何像样的教科书覆盖。您使用的是哪一个?

由于宏做文本替换,所以你写的代码被扩展到

printf("%d\n",++y * ++y );

和然后操作的顺序是不确定的行为所以这个编译器看到2倍的增量,然后乘法

所以,要小心使用宏更好的使用功能,这是编译器可以扩大在线将不承担任何更长的时间来运行。

其次不要以为你增加会发生什么,并使用变量

宏不是函数:他们只是改变程序的文本。该操作被称为的预处理的之前你的代码被编译它会自动执行。人们编写宏,以节省他们的时间并介绍一些变化,以他们的源代码。

当你写SQUARE(x),没有实际的功能可按调用发生,只是文本进行修改。操作是相当愚蠢的,所以你必须在你们这样的情况下做额外的预防措施。请参阅其他答案你的情况说明。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top