(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,就可以避免此类问题了。
阅读全文
0 0
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)
- (void) (&_x == &_y)的注释
- min()的宏定义中的(void) (&_x == &_y)的含义
- min()的宏定义中的(void) (&_x == &_y)的含义
- min()的宏定义中的(void) (&_x == &_y)的含义
- Linux min()的宏定义中的(void) (&_x == &_y)的含义
- (void) (&_min1 == &_min2);
- (void)(&x==&y)
- (void)(&x==&y)
- href="javascript:void(0)"
- href="javascript:void(0)"
- href="javascript:void(0)"
- 差分放大器,可用AD623替代这个模块
- 文章标题
- 开源项目之金山卫士
- 2017多校联合第9场1010 Two String/hdu 6170(正则表达式/dp)
- linux设置静态IP
- (void) (&_x == &_y)
- 《图解HTTP[上野宣]》读书笔记六-4
- 下拉菜单
- Spring Boot 官方文档学习(一)入门及使用
- 同余与欧拉函数
- Oralce weblogic 补丁下载方法
- 写给励志做码农的大学生
- c++ examples
- Object方法学习之equals