代码之家  ›  专栏  ›  技术社区  ›  Gautham Arunachalam

如何理解这个C宏[[副本]

  •  1
  • Gautham Arunachalam  · 技术社区  · 7 年前

    我不能理解这个代码

    #define sqt(x) x*x
    int main(){
    print("%d",sqt(3+1));
    }
    

    我手动得到10的输出。但是当编写代码并编译它时,我得到的答案是7。请解释一下。

    1 回复  |  直到 7 年前
        1
  •  9
  •   Carcigenicate    7 年前

    记住,既然你用的是宏, 3 + 1 之前未评估 sqt x 变成 3 + 1 (不是 4 ),则运算顺序导致产生意外的答案,因为加法发生在乘法之后。

    sqt(3 + 1)
    

    扩展到:

    3 + 1 * 3 + 1
    

    然后,当你像其他方程一样计算这个时:

    3 + 1 * 3 + 1 // Multiplication happens first
    = 3 + 3 + 1
    = 7
    

    这是一个很好的例子,说明了为什么你不应该使用宏,除非它们是绝对必要的,或者你已经做了适当的注意,以确保像操作顺序错误这样的事情不会发生。正如@Barmar指出的那样,可以通过将宏展开以包含显式括号来纠正这种特殊情况:

    #define sqt(x) ((x)*(x))
    

    这将导致评估结果不同,并给出正确答案:

    (3 + 1) * (3 + 1)
    4 * 4
    16