C 语言经典面试题 —— 宏

1. 运算符优先级与括号

#define Cube(a) a*a*a
  • 无法解决 Cube(1+1) ⇒ 1+1*1+1*1+1 ⇒ 4,期待的应当是 8,故将其改造为

    
    #define Cube(a) (a)*(a)*(a)
    
  • 如此,自身运算的优先级是能解决了,和其他表达式结合时便又存在先运算和后运算的算符优先级的问题,比如其前跟着一个除法运算符:

    16/Cube(2)  ⇒ 16 / 2 * 2 * 2 ⇒ 32,而不是期待的 16 / (2*2*2)
  • 故我们期待的宏定义其实应当是一个整体:

    
    #define Cube(a) ((a)*(a)*(a))
    
原文地址:https://www.cnblogs.com/mtcnn/p/9420963.html