c宏的MAX函数
今天从香山上面回来累的跟傻逼一样,回来问了一下胡总的阿里面试的问题。然后其中有一个是宏写max函数。胡总说不好写,然后我就去洗澡了。
洗澡的时候感觉不对啊,回来写了一个:
#define MAX(a,b) a>b?a:b;
测了一下可以。然后胡总说搞个++就不行了。然后有了如下代码:
int x = ;
int y = ;
scanf("%d%c",&x,&y);
printf("%d\n",MAX(x,y++));
printf("%d",y);
这里打印出来的是:
7
8
显然y++被执行了两次,宏跟函数的传递方式不一样,宏是以替换的形式,而函数是先求值再传参数。因此这里其实是执行了 x > (y++)?x:y++,显然y++执行了两次
之后网上搜了一下,又有了下面的版本:
#define max(x,y) ({typeof(x) _x = (x);typeof(y) _y = (y);(void)(&_x == &_y);_x > _y ? _x : _y; })
这里其实是声明了两个变量_x和_y然后进行比较。
其中关键的一句是(void)(&_x == &_y)。
这句话判断了_x和_y的类型是否相等。因为据说c语言不能直接判断typeof()是否相等。
然后这里是判断&x和&y是否相等,就是判断x和y的指针是否相等。在判断两个变量是否相等的时候,编译器会先判断两个变量的类型是否相等。如果x和y的类型不等,那么他们对应的指针类型自然不会相等(编译的时候会产生waring)。
前面的(void)的意义在于将判断两个指针是否相等的结果抛弃。不然据说会提示这段代码没用。
更加安全的办法,应该在typeof前面加一个const,这样会避免对_x和_y的误操作。
c宏的MAX函数的更多相关文章
- JS Math.max() 函数
Math.max(a,b,...,x,y) -- 返回数个数字中较大的值 max是maximum的缩写,中文"最大量"的意思 max函数语法Math.max(a,b,...,x,y ...
- [数据库]关于MAX()函数的一个坑
之前写了这么一条sql语句,目的是取出表中itemid最大的那一条数据. SELECT date, MAX(itemid) AS itemid, group FROM mytable GROUP BY ...
- Matlab:max函数
Matlab中max函数在矩阵中求函数大小的实例如下: C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的每一 ...
- oracle max()函数和min()函数
当需要了解一列中的最大值时,可以使用MAX()函数:同样,当需要了解一列中的最小值时,可以使用MIN()函数.语法如下. SELECT MAX (column_name) / MIN ...
- C语言求两个函数中的较大者的MAX函数
//求两个函数中的较大者的MAX函数 #include <stdio.h> int main(int argc, const char * argv[]) { printf("i ...
- MAX函数和GROUP BY 语句一起使用的一个误区
使用MAX 函数和 GROUP 的时候会有不可预料的数据被SELECT 出来.下面举个简单的例子:想知道每个SCOREID 的 数学成绩最高的分数. 表信息:/*DDL Information For ...
- matlab 中max函数用法
Matlab中max函数在矩阵中求函数大小的实例如下:(1)C = max(A)返回一个数组各不同维中的最大元素.如果A是一个向量,max(A)返回A中的最大元素.如果A是一个矩阵,max(A)将A的 ...
- SQL MAX() 函数
MAX() 函数 MAX 函数返回一列中的最大值.NULL 值不包括在计算中. SQL MAX() 语法 SELECT MAX(column_name) FROM table_name 注释:MIN ...
- SQL- 行转列,多行转多列 - max 函数
效果如图,把同一个 code, 按 cate 列相同行的进行合并后分两行,把mode 每种类型转换成 列名 ,主要用到了 max 函数,很实用 if exists(select * from temp ...
随机推荐
- VB指针 与CopyMemory
体会ByVal和ByRef Dim k As Long CopyMemory ByVal VarPtr(k), 40000, 4 等同于k=40000:从保存常数40000(缺省ByRef)的临时变量 ...
- webApp禁止用户保存图像
img { -webkit-touch-callout: none; }
- struts2学生信息管理系统篇章④
把util包中的代码做了一下注释,分享一下 DateUtil 类 package com.java1234.util; import java.text.SimpleDateFormat; impor ...
- C#敏感关键词过滤代码
System.Text.StringBuilder sb = new System.Text.StringBuilder(text.Length); string filter ...
- Python报错:SyntaxError: Non-ASCII character '\xe5' in file
运行Python脚本总是报一下的错误: SyntaxError: Non-ASCII character '\xe5' in file 原因:Python默认是以ASCII作为编码方式的,如果在自己的 ...
- AFNetworking使用详解
导语: 众所周知,AFNetworking是目前IOS开发中非常受欢迎的第三方网络通信类库,同时AFNetworking对苹果官方NSURLConnection和NSURLSession进行了封装,使 ...
- /root/.bashrc与/etc/profile的异同
要搞清bashrc与profile的区别,首先要弄明白什么是交互式shell和非交互式shell,什么是loginshell 和non-loginshell. 交互式模式就是shell等待你的输入,并 ...
- ArcGis(01)——地图切片以及发布底图服务
ArcGis(01)——地图切片以及发布底图服务 环境 操作系统:win10_x64 Gis版本:Arcis server 10.2 准备 1.tif格式地图资源 2.Arcis server 10. ...
- WebService CXF调试常见报错及解决方案
1.CXF java.lang.RuntimeException: Cannot create a secure XMLInputFactory 解决方案:从apache-cxf/lib下寻找Wood ...
- 给出2n+1个数,其中有2n个数出现过两次,如何用最简便的方法找出里面只出现了一次的那个数(转载)
有2n+1个数,其中有2n个数出现过两次,找出其中只出现一次的数 例如这样一组数3,3,1,2,4,2,5,5,4,其中只有1出现了1次,其他都是出现了2次,如何找出其中的1? 最简便的方法是使用异或 ...