曲径通幽论坛

标题: 宏定义与副作用 [打印本页]

作者: beyes    时间: 2009-8-14 00:11
标题: 宏定义与副作用
测试代码
#include <stdio.h>

#define MIN(x,y) ((x) <= (y) ? (x):(y))

int main ()
{
    int i = 10;
    int k = 8;
    int a[5] = {8,9,11,10,13};

    int *p = a;
    int j;
   
    j = MIN(*p++, i);
    printf("%d\n", j);
   
    printf("%d\n", *p);

    return (0);
}
运行与输出:
beyes@linux-beyes:~/C/micro> ./micro.exe
9
11
说明
定义的宏取两数中较小那个。刚开始 *p 的值为 8 。在执行 (*p++) <= (10) 这个判断后,指针+1,指向了 9,所以取得了最小值 9。然而,在取值阶段,也就是 (*p++):(10),指针 p 再加 1,指向了 11。这里的副作用是,本意是想判断数组第一个元素是否为较小者,然后取得其值,但是经过指针的移动后,最后取得的值是数组的第 2 个元素 9 。




欢迎光临 曲径通幽论坛 (http://www.groad.net/bbs/) Powered by Discuz! X3.2