为了账号安全,请及时绑定邮箱和手机立即绑定

C中宏中括号的必要性

C中宏中括号的必要性

C C++
牧羊人nacy 2019-06-15 10:48:52
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.
查看完整描述

3 回答

?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

预处理宏在编译代码之前执行文本替换,如下所示SQR(b+5)翻译为(b+5*b+5)=(6b+5)=6*3+5=23

正则函数调用在将参数(b+3)传递给函数之前会计算它的值,但是由于宏是预编译的替换,操作的代数顺序变得非常重要。


查看完整回答
反对 回复 2019-06-15
?
GCT1015

TA贡献1827条经验 获得超4个赞

因为(3+5*3+5 == 23).

鉴于((3+5)*(3+5)) == 64.

最好的方法是不使用宏:

inline int SQR(int x) { return x*x; }

或者简单地写x*x.


查看完整回答
反对 回复 2019-06-15
?
慕的地10843

TA贡献1785条经验 获得超8个赞

考虑使用此宏替换宏:

#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来屏蔽宏中的任何参数。


查看完整回答
反对 回复 2019-06-15
  • 3 回答
  • 0 关注
  • 509 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信