关于(void)(&min1 == &min2)的问题和宏define min(a, b)

来源:互联网 发布:php静态调用方法 编辑:程序博客网 时间:2024/06/05 07:07

宏定义:

#define min(x, y)                                 /

({                                                /
    typeof(x) _min1 = (x);                        /
    typeof(y) _min2 = (y);                        /
    (void) (&_min1 == &_min2);                    /
    _min1 < _min2 ? _min1 : _min2;                /

}) 

而第三行:(void)(&_min1 == &_min2) 是:为防止不同类型变量进行比较

int main(int ac, char** av)
{
    char i = 100;
    long j = 1000;
    long k = min(i, j);

    return 0;
}


编译上述代码时编译器会给出警告:comparison of distinct pointer types lacks a cast 
如果去掉(void) (&_min1 == &_min2) 这行,再编译是不会给出警告的。

------------------------------------------------------

#include <stdio.h>

/* 使用该宏时,如果不关心返回值,没有圆括号()也可以,但是{}是必须的 */
#define min(x, y) {                       \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; }

int main ()
{
    min(10, 20); 
    if (1)
        min(10, 20); 
    return 0;
}

------------------------------------------------------
#include <stdio.h>

/* 
 * 用该宏时,如果关心返回值,就必须要圆括号()
 * 最后一句是该宏的返回值 
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int ret;
    ret = min(10, 20);
    printf("ret = %d\n", ret);
    return 0;
}

------------------------------------------------------
#include <stdio.h>

/* 
 * 检测变量类型是否相同
 * (void) (&_min1 == &_min2);
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int  ret;
    int  i;
    char j;
    ret = min(i, j);
    printf("ret = %d\n", ret);
    return 0;
}

------------------------------------------------------
#include <stdio.h>

/* 
 * 防止类似i++类型的参数,被重复计算
 * typeof(x) _min1 = (x);
 */
#define min(x, y) ({                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2; })

int main ()
{
    int ret;
    int i = 100;
    int j = 200;
    ret = min(i++, j++);
    printf("ret = %d\n", ret);
    return 0;
}


------------------------------------------------------
#include <stdio.h>

/*
 * 这种写法,利用了do while的巧妙之处,但是也有最大一个缺憾,无法获得该宏的返回值;
 * 如果只想实现一组语句的正确执行,而不关心其返回值,可以使用do while;
 * 但是如果想获取这组语句的返回值,则必须使用()和{},将返回值放在最后一句。
 */
#define min(x, y)                         \
do {                                      \
    typeof(x) _min1 = (x);                \
    typeof(y) _min2 = (y);                \
    (void) (&_min1 == &_min2);            \
    _min1 < _min2 ? _min1 : _min2;        \
} while (0)

int main ()
{
    min(10, 30);
    return 0;
}

------------------------------------------------------
#include <stdio.h>
int main ()
{
    int  i;
    char j;
    /* 
     * 通过下面测试证明,取址操作获取的地址是有类型的 
     * &i 获取的地址类型为 int  *
     * &j 获取的地址类型为 char *
     */
    printf("&i   = %p\n", &i);
    printf("&i+1 = %p\n", &i+1);
    printf("&j   = %p\n", &j);
    printf("&j+1 = %p\n", &j+1);

    (void)(&i == &j);
    return 0;
}


$ gcc test.c
test.c: 在函数‘main’中:
test.c:17: 警告: 比较不相关的指针时缺少类型转换
$ ./a.out 
&i   = 0xbfeccbac
&i+1 = 0xbfeccbb0
&j   = 0xbfeccbb3
&j+1 = 0xbfeccbb4



原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 人胖走路磨腿怎么办 2岁半宝宝内八字怎么办 大狗跑步累倒怎么办? 拉小提琴的姿势不正确怎么办 屁股摔倒了很痛怎么办 腿摔倒了破了怎么办 骑车摔倒腿肿了怎么办 鸟翅膀老是掉着怎么办 有老人摔倒被讹怎么办 剑鞘囊肿手术后黏连怎么办 上古卷轴5变脏了怎么办 上古卷轴5病了怎么办 法院判的罚金没钱交怎么办 上古卷轴5亲吻出题怎么办 老滚5马不见了怎么办 上古卷轴5杀鸡了怎么办 上古卷轴5东西太多怎么办 上古卷轴天际杀鸡了怎么办 上古卷轴5偷东西被发现怎么办 上古卷轴杀了鸡怎么办 老滚5东西多了怎么办 上古卷轴5被追杀怎么办 全险车自己碰了怎么办 上古卷轴5狗死了怎么办 头发被胶粘住了怎么办 头发被口香糖粘住了怎么办 上古卷轴5杀了npc怎么办 上古卷轴5血太少了怎么办 因牙齿缺失导致变长怎么办 上古卷轴5闪退怎么办? 小米手机4卡顿怎么办 上古卷轴5任务失败怎么办 上古卷轴5爆显存怎么办 老滚5卡住了怎么办 上古卷轴5被木河镇人追杀怎么办 关门的时候有响怎么办 家里门关门太响怎么办 网上赌搏输了2万怎么办 梦见不顺心的事怎么办 振动声桥洗澡时怎么办 同校生2高潮了怎么办