【问题标题】:What is the difference between x*x and (x)*(x) in C? [duplicate]C中的x*x和(x)*(x)有什么区别? [复制]
【发布时间】:2021-06-28 14:41:29
【问题描述】:

这个程序返回 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;
}

【问题讨论】:

  • 因为b + 2 * b + 2 不是(b + 2) * (b + 2)
  • 在 C 中,宏在预处理过程中被扩展,所以不像你通常调用函数那样调用 sqr,定义首先扩展为 ((x)*(x))x 替换为 (b + 2)在这种情况下。
  • 那里必须是一个副本,但我似乎找不到它。

标签: c macros


【解决方案1】:

区别在于宏的展开方式。

使用额外的括号,预处理器将表达式 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

*(乘法)运算符比+(加法)运算符具有higher precedence

【讨论】:

    【解决方案2】:

    如果宏是这样定义的

    #define sqr(x) ( x * x )
    

    当在这个宏扩展中时

    sqr(b+2);
    

    x 替换为b + 2 后,您将拥有

    b + 2 * b + 2
    

    不一样

    ( b + 2 ) * ( b + 2 )
    

    如果宏被定义为

    #define sqr(x) ( ( x ) * ( x ) )
    

    【讨论】:

      猜你喜欢
      • 2021-12-31
      • 1970-01-01
      • 1970-01-01
      • 2012-02-15
      • 2011-05-10
      • 2018-03-16
      • 1970-01-01
      • 1970-01-01
      • 2010-09-18
      相关资源
      最近更新 更多