C++之宏定义实现两个数最值
转自:https://blog.csdn.net/baidu_33725271/article/details/69478782
方法一: 利用三重条件运算符
#include <stdio.h>
#define MIN(A,B) ( (A) > (B) ? (B) : (A) )
#define MAX(A,B) ( (A) > (B) ? (A) : (B) )
int main(void)
{
printf("%d\n",MIN(,));
printf("%d\n",MAX(,)); return ;
}
值得关注的是:
1 . 宏定义的变量在引用的时候,用 ()括起来,防止预处理器展开的错误。
2 . (a > b ? action1 : action2 ) 这样的方式和 if —else 结果一样,但他会使得编译器产生更优化的代码,这在嵌入式编程中比较重要。
方法二: typeof 关键字
#include <stdio.h>
#define MIX(X,Y) ({\
typeof(X) x_ = (X);\
typeof(Y) y_ = (Y);\
(x_< y_)? x_:y_;\
})
#define MAX(X,Y) ({\
typeof(X) x_ = (X);\
typeof(Y) y_ = (Y);\
(x_>y_)? x_:y_;\
})
int main(int argc, char const *argv[])
{
int num1,num2;
printf("input two numbers:");
scanf("%d %d",&num1,&num2);
printf("mix is %d,max is %d\n",MIX(num1,num2),MAX(num1,num2));
return ;
}
值得借鉴的是:
1 . typeof 关键字 用于获得变量的数据类型 。
2 . 宏定义的实现,用 { } 作为宏整体,里面是一个代码块,语句用 ; 隔开 。
3 . 当宏的实现长度很长的时候,使用换行符 \ 换到下一行 。
4 . 使用输入数据的类型定义局部变量 x_ 和 y_ 实现对原始数据的保护。
5 . 宏实现,不能用 ; 结尾
其他参考:https://zhidao.baidu.com/question/1703790750415801020.html
C++之宏定义实现两个数最值的更多相关文章
- 请定义一个宏,比较两个数的a、b的大小,不能使用大于、小于、if语句
请定义一个宏,比较两个数的a.b的大小,不能使用大于.小于.if语句 方法一: #define max(a,b) ((((long)((a)-(b)))&0x80000000)?(b): ...
- C语言宏定义取得两数的最大值和最小值
/*本程序时为了验证用宏来做 * 两个数的大小比较的写法*/#include<stdio.h>#define MAX(x,y) ((x)<(y)?(y):(x))#define MI ...
- c语言实现交换两个数的值
C语言中要实现交换两个数的值,可以有很多种方法,具体如下所述. 不使用中间变量: // 异或, a^=b^=a^=b; a ^= b; b ^= a; a ^= b; // 加减 a = a + b; ...
- C语言交换两个数的值
#include<stdio.h> int main() { //交换两个数的值 // 方法一 可读性最好 ; ; int temp ; temp = a; a = b; b = temp ...
- java中不创建使用第三方变量,交换两个数的值
1.直接使用算术运算法交换 先把两个数的和赋值给其中一个,然后做减法.例如num1=num1+num2; 此时num2(交换之后)就等于num1减去num2:废话不多说,直接上代码 public cl ...
- 请定义一个宏,比较两个数a、b的大小,不能使用大于、小于、if语句
提供一种算法: #define max(a, b) ((((a)-(b)) + fabs(a-b))?(a):(b))
- C/C++宏定义交换两个值
#define SWAP(t,a,b) \ do{ \ t c = a; \ a = b; \ b = c; \ }); void main() { ,b=; SWAP(int,a,b); }
- php不用第三个变量,交换两个数的值
//字符串版本 结合使用substr,strlen两个方法实现 $a="a"; $b="b"; echo '交换前 $a:'.$a.',$b:'.$b.'< ...
- c语言函数实现交换两个数的值
代码: #include <stdio.h> void swap(int x,int y) { int temp; temp = x; x = y; y = temp; printf(&q ...
随机推荐
- Linux系统之-文件系统,桌面环境
文件系统 文件类型普通文件,目录文件,连接文件,设备与设备文件,套接字,管道 普通文件(regular file):就是一般存取的文件,由ls -al显示出来的属性中,第一个属性为 [-],例如 [- ...
- 无法在要求对象展开的函数中使用 __try
解决方案: 单独把try里面的代码封装成一个函数,然后再在try里面调用
- 内核module读取进程页目录
根据当前CR3寄存器内容,读取对应物理内存中的页目录页,并进行解析 1: void dumpPageDirectoryEntry(u32 entry) 2: { 3: u8 present; 4: u ...
- how to catch error in make error message
make 2>&1 | grep error -C 10 -n
- java 重新学习 (一)
一 垃圾回收特点 1.垃圾回收的工作目标是回收物对象的内存空间,这些内存空间都是jvm堆内存里的空间,垃圾回收器值回收内存资源,对他的物理资源:数据库连接,磁盘I/O等资源则无能为力 2.更快进行垃圾 ...
- UVA_548Tree
这是一个很经典的建树,然而当时不会!!!! 给你一个中序和后序 先建一个二叉树,然后找最优解(最优解就是一个叶子节点到根节点权值最小, 同时本身权值最小) //生成一棵树 int build(int ...
- 利用TKinter模块创建GUI窗口
# -*- coding: utf-8 -*- from Tkinter import * root = Tk() # 80x80代表了初始化时主窗口的大小,0,0代表了初始化时窗口所在的位置 ...
- window下eclipse搭建hadoop环境
1 生成插件jar 1.1 安装java,ant运行环境 1.2 下载hadoop-2.5.0.tar.gz并解压到指定目录 1.3 下载hadoop2x-eclipse-plugin-master. ...
- HashSet、LinkedHashSet、TreeSet的区别
HashSet:哈希表是通过使用称为散列法的机制来存储信息的,元素并没有以某种特定顺序来存放: LinkedHashSet:以元素插入的顺序来维护集合的链接表,允许以插入的顺序在集合中迭代: Tree ...
- ReentrantLock的相关方法使用
获取锁定 void lock():常用获取锁定的方法 void lockInterruptibly():如果当前线程未被中断,则获取锁定:如果当前线程被中断,则出现异常 boolean tryLock ...