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)