首页 > 解决方案 > C中的x*x和(x)*(x)有什么区别?

问题描述

这个程序返回 a=25,但如果我将 sqr(x) 定义为 (x*x),它返回 a=11。为什么会这样?

#include <stdio.h>
#define sqr(x) ((x)*(x))
main (){
    int a,b=3;
    
    a=sqr(b+2);
    printf("a=%d\n",a);
    return 0;
}

标签: cmacros

解决方案


不同之处在于宏的扩展方式。

使用额外的括号,预处理器将表达式扩展为sqr(b+2)

((b+2)*(b+2))

然后编译器将其解释为:

a = ((3+2)*(3+2))
  = (5*5)
  = 25

如果没有额外的括号,预处理器会将表达式扩展为sqr(b+2)

(b+2*b+2)

编译器将其解释为:

a = (3+2*3+2)
  = (3+(2*3)+2)
  = (3+6+2)
  = 11

*乘法)运算符的优先级高于+(加法)运算符。


推荐阅读