猿问

C中宏中括号的必要性

C中宏中括号的必要性

我尝试使用宏的定义。SQR在以下代码中:

#define SQR(x) (x*x)int main(){
    int a, b=3;
    a = SQR(b+5);      // Ideally should be replaced with (3+5*5+3), though not sure.
    printf("%d\n",a);
    return 0;}

印出来23..如果我将宏定义更改为SQR(x) ((x)*(x))那么输出就和预期的一样,64..我知道调用C中的宏将调用替换为宏的定义,但我仍然不明白它是如何计算的23.


牧羊人nacy
浏览 510回答 3
3回答

鸿蒙传说

预处理宏在编译代码之前执行文本替换,如下所示SQR(b+5)翻译为(b+5*b+5)=(6b+5)=6*3+5=23正则函数调用在将参数(b+3)传递给函数之前会计算它的值,但是由于宏是预编译的替换,操作的代数顺序变得非常重要。

GCT1015

因为(3+5*3+5 == 23).鉴于((3+5)*(3+5)) == 64.最好的方法是不使用宏:inline int SQR(int x) { return x*x; }或者简单地写x*x.

慕的地10843

考虑使用此宏替换宏:#define SQR(x) (x*x)使用b+5作为争论。你自己做替补吧。在你的代码中,SQR(b+5)将成为:(b+5*b+5),或(3+5*3+5)..现在记住你的运算符优先规则:*以前+..因此,评估如下:(3+15+5),或23.宏的第二个版本:#define SQR(x) ((x) * (x))是正确的,因为您使用这些父函数来使宏参数不受运算符优先级的影响。本页解释操作符偏好C有一个很好的图表。这是C11参考文件的相关章节。这里要记住的是,您应该养成习惯,始终使用Parens来屏蔽宏中的任何参数。
随时随地看视频慕课网APP
我要回答