温故而知新_C语言_define_宏
define
define是C语言的预处理,作用是宏定义。
所谓宏,是将一些命令组织在一起,作为一个单独命令完成一个特定任务。
预处理命令以“#”号开头,如包含命令#include,宏定义命令#define等。
一般都放在源文件的前面,它们称为预处理部分。
所谓预处理是指在进行编译之前所作的工作。 在进行编译C语言源程序的前一个步骤就是预处理。
define可以定义函数,常量(也就是定义一个不可变的变量,包括字符,字符串)。
使用方式:
(1)定义常量
#include<string.h>
#include<stdio.h>
#define PI 3.14
#define PI_Name "pi is" int main(void)
{
printf("%s\t%f",PI_Name,PI); //\t是TAB。输出宏
}
定义了两个宏,一个数字,一个字符串。
我们使用正常的方式可以输出。
他们是不可修改的常量。如果对其修改,会报错。

(2)定义函数(有参数)
定义函数可以分为有参数,无参数(定义表达式)两种。
#include<string.h>
#include<stdio.h>
#define A (a,b)(a)+(b) int main(void)
{
int x=A(,);
printf("%d",x);
}
我们定义一个宏,是一个带有参数的宏。
A函数带有a,b两个参数,并返回a+b的值。
为什么a+b要写成(a)+(b)呢?
是为了保证运算。
请看下面的例子
#include<string.h>
#include<stdio.h>
#define A(a)a*a int main(void)
{
int x,c=;
x=A(c+);
printf("%d",x);
}
我们希望返回a*a值。
此代码我们在A函数中填入的C+1也就是3,A函数返回的值应该是9。

但确实返回的5,这与我们所期望的值有很大的偏差。
因为,A(c+1)拆开后等于c*c+1所以等于5。
如果我们将a*a加上括号

不出所料,我们得到正确的值。
这回将宏拆开。
A(C+1)=(c+1)*(c+1)
括号将运算的优先级提高了。所以会得到一个正确的值。
但是!
有时候加这么样加括号还是不好用的! 为什么呢?请我们考虑一下运算的优先级。
请看下面的代码
#include<string.h>
#include<stdio.h>
#define A(a)(a)*(a)
int main(void)
{
int x,c=;
x=/A(c+);
printf("%d",x);
}
在上面的代码中A函数返回值是9,我们这把依旧让返回值等于9,不过我们让X的值等于99/A(c+1).
我们希望得到的值是11。

但是我们为什么得到的却是99呢?
因为优先级的关系,99/A(c+1)等于99/(c+1)*(c+1)也就是99/3*3,所以的值是99。
那怎么解决呢?
我们根据A函数的含义,将A函数内的表达式的预算优先级提高。
也就是
#include<string.h>
#include<stdio.h>
#define A(a)((a)*(a))
int main(void)
{
int x,c=;
x=/A(c+);
printf("%d",x);
}
OK

(3)定义函数(无参数)(定义表达式)
其实定义常量也算是定义函数无参数的一种,但是我为了好区分这两种定义宏的区别,特地分开。
毕竟定义的方法上有一定的区别。
#include<string.h>
#include<stdio.h>
#define A (a+3)
int main(void)
{
int x,a=;
x=/A;
printf("%d",x);
}
我们依旧是定义一个A“函数”,但是无参数。
这回这个A“函数”可以理解为一个表达式。
请注意看在代码中使用A“函数”的方式,并没有括号,也就是A“函数”不接受参数。而且在再宏定义的时候A“函数”内a是存在代码内。
这种行为,更像是一种提前定义好的表达式。其中的“参数” 都是必须严格符合A“函数”。
也就是x=99/A;这句等于x=99/(a+3)
当然这句话也要考虑优先级的问题。所有A“函数”加上了括号。
因为是我想要a+3,根据含义,最后形成了A(a+3)这个样子
温故而知新_C语言_define_宏的更多相关文章
- 温故而知新_C语言_递归
递归. 是的,差不多就是这种感觉.上面就是类似递归的显示表现. 2017 10 24更新: 递归这个问题放了很久.也没有写.大概是自己还没有好好理解吧. 在这里写下自己理解的全部. 一 何为递归. 字 ...
- 温故而知新_C语言_前缀++(--)和后缀++(--)
前缀++(--)和后缀++(++)是有区别的. 再单独使用的时候是没有区别的,都是自身递增或者递减1. 但是综合使用起来会一样吗? 下面的例子都是++,替换成--也是一样,道理都是一样的. 请先看下面 ...
- 【书籍下载链接】_1_第一轮_C语言书籍
各位朋友,如果您觉得下载的电子书,看的还可以,请购买纸质版的图书,如果您觉得 您下载的书,不值得一看请在下载后直接删除. Windows汇编:http://dl.vmall.com/c0jk1v970 ...
- C语言中宏定义(#define)时do{}while(0)的价值(转)
C语言中宏定义(#define)时do{}while(0)的价值 最近在新公司的代码中发现到处用到do{...}while(0),google了一下,发现Stack Overflow上早有很多讨论,总 ...
- c 语言中宏定义和定义全局变量的区别
宏定义和定义全局变量的区别: 1 作用时间不同. 宏定义在编译期间即会使用并替换,而全局变量要到运行时才可以. 2 本质类型不同. 宏定义的只是一段字符,在编译的时候被替换到引用的位置.在运行中是没有 ...
- 选择排序_C语言_数组
选择排序_C语言_数组 #include <stdio.h> void select_sort(int *); int main(int argc, const char * argv[] ...
- 插入排序_C语言_数组
插入排序_C语言_数组 #include <stdio.h> void insertSort(int *); int main(int argc, const char * argv[]) ...
- 快速排序_C语言_数组
快速排序_C语言_数组 #include <stdio.h> void quickSort(int *, int, int); int searchPos(int *, int, int) ...
- 冒泡排序_C语言_数组
冒泡排序_C语言_数组 #include <stdio.h> //冒泡排序 小->大 void sort(int * pArray, int len); int main(int a ...
随机推荐
- poj 2154 Color——带优化的置换
题目:http://poj.org/problem?id=2154 置换的第二道题! 需要优化!式子是ans=∑n^gcd(i,n)/n (i∈1~n),可以枚举gcd=g,则有phi( n/g )个 ...
- JAVA 正则表达式 Regex
//正则表达式,去掉空格.换行.制表位 public static void replaceBlank(){ Pattern p = Pattern.compile("\\s*|\t|\r| ...
- JavaScript去除字符串两边空格trim
去除字符串左右两端的空格,在大部分编程语言中,比如PHP.vbscript里面可以轻松地使用 trim.ltrim 或 rtrim实现.但在js中却没有这3个内置方法,需要手工编写.下面的实现方法是用 ...
- 自然语言处理--nltk安装及wordnet使用详解
环境:python2.7.10 首先安装pip 在https://pip.pypa.io/en/stable/installing/ 下载get-pip.py 然后执行 python get-pip. ...
- mybatis sql中的条件语句
1.mybatis判断是否为空或null <if test="type!=null and type!=''"> AND type = #{type} </if& ...
- python第三十二天-----算法
算法(Algorithm):一个计算过程,解决问题的方法时间复杂度:用来评估算法运行效率的一个东西ps:在日常使用中,请使用sort(),because no zuo no die! 1.冒泡排序:指 ...
- 分布式爬虫搭建系列 之一------python安装及以及虚拟环境的配置及scrapy依赖库的安装
python及scrapy框架依赖库的安装步骤: 第一步,python的安装 在Windows上安装Python 首先,根据你的Windows版本(64位还是32位)从Python的官方网站下载Pyt ...
- JVM中存储类信息的三个表格
摘自:<Java Performance>第三章 Internal Class Loading Data The HotSpot VM maintains three hash table ...
- 11-18网页基础--第二部分CSS样式属性(1)
第一课:样式属性 style 样式:style样式不仅可以直接在<body>中设置成整个网页的样式.格式:为了将样式.格式多样化,也可以将style单独抽出来,作为一个独立的个体,放在&l ...
- 具有避障和寻线功能的Arduino小车
标签: Arduino 乐高 机器人 创客对于成年人来说,多半是科技娱乐,或者是一种是一种向往科技的人生态度,总是希望自己不仅可以看到或者听到科技的资讯,还希望能够亲身制作科技玩意,从而更好地体 ...