(void) (&_x == &_y)

来源:互联网 发布:e路畅通怎么连接网络 编辑:程序博客网 时间:2024/06/05 18:15
#include <stdio.h>#include <stdlib.h>#define min(x, y) ({     \ typeof(x) _x = (x);    \ typeof(y) _y = (y);    \ (void) (&_x == &_y);   \ _x < _y ? _x : _y; })int main(void)  {          int x = 2;     int y = 3;     int m;     m = min(x,y);          printf("m=%d\n",m);     printf("&x=%d\n",&x);     printf("&y=%d\n",&y);          //if((void)(int* ==int*))    // if((void)(&x ==&y))    //(&x ==&y);     (void)(&x ==&y);  //指针(地址)的比较也需要相同类型,不同的话编译器就错误编译不过。(void) 是为了防止编译器警告语句的值没有被使用。     //这里&x肯定和&y值不相等,但是他们的类型相同,可以进行比较,只是比较结果不相等而已。     //而void其实加不加都可以,他只是为了防止编译器说这条==条件判断语句判断完后的返回值没有用过而已,所以我们将它强制类型转化,表示我们     //已经用过了这个返回值,当然有些编译器不加void也不会报错     1;    printf("int *==int *\n");    (void)printf("int *==int *\n");            return 0;  }


为什么不用简单的#define min(x,y) ((x) < (y) ? x : y)

因为,如果如此定义,那么对于一些特殊的值传入此宏之后,就会产生一些副作用,产生的结果,就不是我们想要的了,比如:

min(++a,++b) ==> ((++a)<(++b))?(++a) : (++b) 
就使得,a++b++分别执行了2次,而且min的结果,也不对了。而用上面那个复杂的定义,多加了局部变量_x_y,就可以避免此类问题了。

原创粉丝点击