目录

零基础 C/C++ 学习路线推荐 : ​​C/C++ 学习目录​​ >> ​​C 语言基础入门​

一.define 简介

​C 语言​​中,除了可以用 ​​#define​​ 定义一个标识符来表示一个常量,还可以用 ​​#define 定义函数​​,例如:

//定义常量
#define MAX_VALUE 100 //定义整型变量MAX_VALUE值为100
#define USER_NAME "huge" //定义字符串变量USER_NAME值为"huge"
#define PI 3.1415926 //定义浮点数变量PI值为3.1415926

//定义函数
#define MAX(a,b) (a>b)?a:b //取两个数最大值
#define MIN(a,b) (a<b)?a:b //取两个数最小值


凡是以 # 开头的均为预处理指令,预处理又叫预编译。预编译不是编译,而是编译前的处理。这个操作是在正式编译之前由系统自动完成的。

二.define 定义函数

1.define 定义不带参数的函数

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define RESULT (x*2+5)

int main()
{
int x = 10;
printf("RESULT是:%d\n",RESULT);
return 0;
}
/*
RESULT是:25
*/


2.define 定义带参数的函数

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define MAX(a,b) (a>b)?a:b //取两个数最大值
#define MIN(a,b) (a<b)?a:b //取两个数最小值

int main()
{
printf("最大值是:%d\n",MAX(5,100));
printf("最小值是:%d\n",MIN(5,100));
return 0;
}
/*
最大值是:100
最小值是:5
*/


三.define 定义函数陷阱

1.define 函数陷阱一

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string>

#define RESULT(x) x*x

int main()
{
printf("RESULT是:%d\n",RESULT(2));
printf("RESULT是:%d\n",RESULT(2+1));
return 0;
}
/*
RESULT是:4
RESULT是:5
*/


很蒙蔽??为什么第二个计算结果不是​​9​​,而是​​5​​??

#define RESULT(x)  x*x
RESULT(2) 等价 2*2 = 4
RESULT(2+1) 等价 2+1*2+1 = 5


2.define 函数陷阱一解决办法

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <string>

#define RESULT(x) (x)*(x) //在参数两侧加括号

int main()
{
printf("RESULT是:%d\n",RESULT(2));
printf("RESULT是:%d\n",RESULT(2+1)); //等价 (2+1)*(2+1) = 9
return 0;
}
/*
RESULT是:4
RESULT是:9
*/


3.define 函数陷阱二

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string>
#define RESULT(x) (x)*(x)
int main()
{
printf("RESULT是:%d\n",RESULT(2));
printf("RESULT是:%d\n",9/RESULT(2+1));
return 0;
}
/*
RESULT是:4
RESULT是:9
*/


很蒙蔽??为什么第二个计算结果不是​​1​​,而是​​9​​??

#define RESULT(x)  x*x
RESULT(2) 等价 2*2 = 4
9/RESULT(2+1) 等价 9/(2+1)*(2+1) = 5


4.define 函数陷阱二解决办法

/******************************************************************************************/
//@Author:猿说编程
//@Blog(个人博客地址): www.codersrc.com
//@File:C语言教程 - C语言 define定义函数
//@Time:2021/06/27 08:00
//@Motto:不积跬步无以至千里,不积小流无以成江海,程序人生的精彩需要坚持不懈地积累!
/******************************************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <string>
#define RESULT(x) ((x)*(x)) //在参数两侧加括号,整个表达式也需要加上括号

int main()
{
printf("RESULT是:%d\n",RESULT(2));
printf("RESULT是:%d\n",9/RESULT(2+1));
return 0;
}
/*
RESULT是:4
RESULT是:1
*/


以上讨论说明,对于宏定义,保险的做法是不仅应在参数两侧加括号,也应在整个字符串外加括号。

四.猜你喜欢

  1. ​C 语言 数组下标越界和内存溢出区别​
  2. ​C 语言 指针声明和定义​
  3. ​C 语言 指针 p++ / p–​
  4. ​C 语言 p++/§++/_(p++)/_p++​
  5. ​C 语言 使用指针遍历数组​
  6. ​C 语言 指针和数组区别​
  7. ​C 语言 指针数组和数组指针区别​
  8. ​C 语言 空指针 NULL​
  9. ​C 语言 void 指针​
  10. ​C 语言 野指针​
  11. ​C 语言 函数值传递和址传递​
  12. ​C 语言 函数缺省参数​
  13. ​C 语言 函数不定长参数​
  14. ​C 语言 函数指针​
  15. ​C 语言 指针函数​
  16. ​C 语言 回调函数 callback​
  17. ​C 语言 typedef​
  18. ​C 语言 define 定义常量​
  19. ​C 语言 define 防止头文件重复包含​
  20. ​C 语言 define​​ ​​定义函数​