Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的宏处理器+;_C++ - Fatal编程技术网

C++ c+中的宏处理器+;

C++ c+中的宏处理器+;,c++,C++,大家好,我对这个代码有疑问 #include<iostream> #define SQR(x)(x*x) int main() { int a, b=3; a = SQR(b+1); std::cout << a; } #包括 #定义SQR(x)(x*x) int main(){ int a,b=3; a=SQR(b+1); std::cout宏扩展为文本 (b + 1 * b + 1) 所以你的结果是: 3 + (1 * 3) + 1.

大家好,我对这个代码有疑问

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

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

    std::cout << a;
}
#包括
#定义SQR(x)(x*x)
int main(){
int a,b=3;
a=SQR(b+1);

std::cout宏扩展为文本

(b + 1 * b + 1)
所以你的结果是:

3 + (1 * 3) + 1.
将宏更改为:

#define SQR(x)((x)*(x))

它应该可以工作。

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

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

    std::cout << a;
}
或者更一般地说:

template<class T> inline T SQR(T x) {
    return x*x;
}

这将扩展到
((b+1)*(b+1))
。但是,通常我不建议为此使用宏,因为还有其他潜在问题,例如
SQR(x++)
扩展到
((x++)*(x++)

这就是您的代码扩展到的:

a = (b + 1 * b + 1)

由于
*
的优先级高于
+
1*b
首先计算。

预处理器是一个文本替换引擎。它不进行语义解析。感谢您的解释我对编写SQR(++x)有疑问然后将x的值传递为3,那么为什么在我的例子中,结果会是25。你在SQR(++x)中看到的是。哦,好的,谢谢,但是有没有正确的方法呢?是的,做
++x;a=SQR(x);
或者,正如james McLaughlin指出的,不要使用宏。
#define SQR(x) ((x)*(x))
a = (b + 1 * b + 1)