【问题标题】:Different output from macros and function definition [duplicate]宏和函数定义的不同输出[重复]
【发布时间】:2013-10-08 04:19:27
【问题描述】:
#include<stdio.h>
#define prod(a,b) ((a>b)?a*a:b*b)

int prod1(int a,int b){
       return ((a>b)?a*a:b*b);
}

int main(){
        int p=0,q=-1;
        int p1=0,q1=-1;
        printf("%d ",prod(p1++,q1++));
        printf("%d ",prod1(p++,q++));
        return 0;
}

输出是: 1 0

为什么不一样?宏定义与函数定义有何不同,为什么会产生不同的结果?不是所有2个输出都等于0吗?

【问题讨论】:

  • 有什么不同?有什么不同?
  • 多次修改未排序的变量是未定义的行为。
  • 在第一种情况下(使用宏时)您有未定义的行为。手动展开宏,您会看到您对pq 对象进行了未排序的访问和修改。
  • 回答这个问题无异于助长懒惰。
  • @hacks 你学得很快。 :P

标签: c function macros


【解决方案1】:

在宏中

#define prod(a,b) ((a>b)?a*a:b*b)

a 和 b 被多次引用。所以

prod(p1++,q1++)

变成

(p1++ > q1++) ? p1++*p1++ : q1++*q2++

请注意,这与调用函数非常不同

prod1(p1++, q1++)

只会增加p1q1一次。而且这样做是可以预见的。

【讨论】:

  • 哦,对了。在询问之前应该先扩展它。我的错。
  • @hacks 实际上不应该手动扩展它,然后甚至不会在 SO 上搜索它。
【解决方案2】:

查找预处理器完成其工作后编译的代码:

int prod1(int a,int b){
       return ((a>b)?a*a:b*b);
}

int main(){
    int p=0,q=-1;
    int p1=0,q1=-1;
    int p2=0,q2=-1;
    printf("%d ",((p1++>q1++)?p1++*p1++:q1++*q1++));
    printf("%d ",prod1(p++,q++));
    printf("%d ",(p2>q2)?p2*p2:q2*q2);
    return 0;
}

【讨论】:

    【解决方案3】:

    宏的参数ab 被作为文本复制到宏的扩展主体中,因此prod(p1++,q1++) 扩展为((p1++&gt;q1++)?p1++*p1++:q1++*q1++),这与函数的计算结果明显不同。

    在标准 C 中,如果单个对象在连续的 sequence points 之间被多次修改,则它是未定义的,因此宏会导致未定义的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-18
      • 2015-12-18
      • 2023-03-13
      • 1970-01-01
      • 1970-01-01
      • 2016-02-13
      • 2019-08-05
      相关资源
      最近更新 更多