首页 > 其他分享 >C语言max宏的进化

C语言max宏的进化

时间:2022-09-25 15:36:30浏览次数:78  
标签:进化 示例 int max void C语言 MAX type define

C语言max宏的进化

lv1:shit

#define   MAX(a, b)   a > b ? a : b

问题所在不必多言

lv2:角度:参数也可为expr

解:

#define MAX(a, b)   (a) > (b) ? (a) : (b)

bug示例:

#include "stdio.h"

#define MAX(a, b)   (a) > (b) ? (a) : (b)

int main(void)
{
   printf("MAX(a, b) = %d\r\n", 2 + MAX(3, 4));

   return 0;
}

lv3:角度:宏本身为Expr的一部分

解:

#define   MAX(a, b)     ((a) > (b) ? (a) : (b))

bug示例:

#include "stdio.h"

#define MAX(a, b)   (a) > (b) ? (a) : (b)

int main(void)
{
   int a = 2;
   int b = 3;

   printf("MAX(a, b) = %d\r\n", MAX(++a, ++b));

   return 0;
}

lv4:传入参数使用中自身改变的影响

解:

#define MAX(a,b)({                         \
                               int _a = a;       \
                               int _b = b;       \
                               _a > _b ? _a : _b; \
                        })

bug示例

#include<stdio.h>
#define MAX(a,b)({                         \
                               int _a = a;       \
                               int _b = b;       \
                               _a > _b ? _a : _b; \
                        })

int main(void)
{
   float a = 2.1;
   float b = 3.2;

   printf("MAX(a, b) = %f\r\n", MAX(a, b));

   return 0;
}

lv5:范类型

解:

#define MAX(type,a,b)({                     \
                               type _a = a;       \
                               type _b = b;       \
                               _a > _b ? _a : _b; \
                           })

bug示例

#include "stdio.h"

#define MAX(type,a,b)({                     \
                               type _a = a;       \
                               type _b = b;       \
                               _a > _b ? _a : _b; \
                           })

int main(void)
{
   float a = 2.1;
   int b = 3.2;

   printf("MAX(a, b) = %f\r\n", MAX(int,a, b));

   return 0;
}

Final:允许跨类型

解:

#define max(a, b)       ({                       \
                           typeof(a) _a = (a);   \
                           typeof(b) _b = (b);   \
                           (void) (&_a == &_b); \
                           _a > _b ? _a : _b; })

点睛之笔:(void) (&a == &b);,判断地址时编译器首先进行类型判断,一旦类型混用,就可给出warning.

参考:https://www.eet-china.com/mp/a90968.html

标签:进化,示例,int,max,void,C语言,MAX,type,define
From: https://www.cnblogs.com/Alexx/p/16727950.html

相关文章

  • C语言第18天,字符串处理函数
    字符串处理函数与printf不同,这些函数不在之前熟悉的头文件stdio.h中。而是在字符串专用的头文件string.h中。1.获取字符串长度strlenstrlen函数可以获取字符数组中的字......
  • 简单测试C语言<string.h>中strerror(int errornum)能输出什么
    使用一个简单程序来验证一下:#include<stdio.h>#include<string.h>intmain(intargc,char*argv[]){for(inti=-5;i<50;i++)printf("errno[%2......
  • 在递增的链表中删除min到max之间的所有元素
    在递增的链表中删除min到max之间的所有元素存在一个递增的链表,其中相邻两个结点的数据域的值要么相等,要么就是后面的大于前面的,对该表进行删除值属于(min,max)包括min和m......
  • 关于C语言的学习 01
    #include<stdio.h> /*include称为文件包含命令*/voidmain() //定义主函数{               //main函数体开始函数声明部分C语言的......
  • 什么是C语言
    什么是C语言?C语言是一门计算机语言计算机语言是什么呢?人和计算机交流的语言,如C/C++、Java、python 语言的发展?二进制语言(硬件-电-正电1/负电01010100101001100......
  • C语言:求质因数的函数
    #include<stdio.h>voidzys(inta){inti;printf("%d=",a);for(i=2;i<=a;i++){while(a%i==0){printf("%d",i);......
  • BM93,BM94接雨水问题(最大水量maxArea和总水量trapWater问题)(双指针)
    总水量问题BM94trapWater()描述给定一个整形数组arr,已知其中所有的值都是非负的,将这个数组看作一个柱子高度图,计算按此排列的柱子,下雨之后能接多少雨水。(数组以外的......
  • C语言第17天,字符串与字符指针
    1.字符串常量不可修改#include<stdio.h>intmain(){char*pStr="HelloWorld\n";printf("%s",pStr);pStr[0]='h';//将H变为hprintf("%s",pStr);return0;}我们知道字......
  • C语言的一些有用设计
    一安装进度条:1#include<stdio.h>2#include<string.h>3#include<unistd.h>45voidProcBar()6{7inti=0;8......
  • C语言递归汉诺塔
    #include<stdio.h>intmain(){voidhanoi(intn,charone,chartwo,charthree);intm;printf("Inputthenumberofdiskes:");scanf("%d",&m);......