c ++中的宏处理器

Fre*_*911 2 c++

大家好,我对此代码有疑问

#include<iostream>
#define SQR(x)(x*x) 

int main() {
    int a, b=3;
    a = SQR(b+1);

    std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)

结果是7而不是16.我无法理解它.

Ser*_*rge 5

宏扩展为文字

(b + 1 * b + 1)
Run Code Online (Sandbox Code Playgroud)

所以你的结果是:

3 + (1 * 3) + 1.
Run Code Online (Sandbox Code Playgroud)

将您的宏更改为:

#define SQR(x)((x)*(x))
Run Code Online (Sandbox Code Playgroud)

它应该工作.

  • 您在SQR(++ x)中看到的是[未定义行为](http://stackoverflow.com/q/4176328/416627). (2认同)
  • 是的,做`++ x; a = SQR(x);或者,正如詹姆斯麦克劳林指出的那样,不要使用宏. (2认同)

Jam*_*lin 5

替换宏后,代码如下所示:

int main() {
    int a, b=3;
    a = b+1*b+1;

    std::cout << a;
}
Run Code Online (Sandbox Code Playgroud)

b+(1*b)+1与运算符优先级相同.您可以通过使用函数来修复它:

inline int SQR(int x) {
    return x*x;
}
Run Code Online (Sandbox Code Playgroud)

或者更一般地说:

template<class T> inline T SQR(T x) {
    return x*x;
}
Run Code Online (Sandbox Code Playgroud)

或者通过括起括号中的宏参数:

#define SQR(x) ((x)*(x))
Run Code Online (Sandbox Code Playgroud)

哪个会扩大到((b+1)*(b+1)).一般情况下,我不建议使用宏,因为还有其他潜在的问题,例如SQR(x++)扩展到((x++)*(x++)).