题
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)
,没有实际的功能可按调用发生,只是文本进行修改。操作是相当愚蠢的,所以你必须在你们这样的情况下做额外的预防措施。请参阅其他答案你的情况说明。
不隶属于 StackOverflow