先展示代码
1.#define 定义函数,函数不带参数
#include <stdio.h>
#include <stdlib.h>
#define RESULT (x*2+5)
int main()
{
int x = 10;
printf("RESULT是:%d\n",RESULT);
return 0;
}
2.#define 定义函数,函数带参数
#include <stdio.h>
#include <stdlib.h>
#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
*/
1.运行结果
2.运行结果
三.#define 定义函数陷阱
3.1你怎么理解带函数带参数,参数进入结构体中,理解的充分了吗
先上程序
#include <stdio.h>
#include <stdlib.h>
#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吗?
实际程序的过程
2+1*1+2
修改:
printf("RESULT是:%d\n",RESULT((2+1))); //或 #define RESULT(x) (x)*(x) //在参数两侧加括号
输出结果:
![]()
结论:
所以调用中的实参,只是实实在在的只是做了替换x和1+2,意思是当传入x的时候,x不是3就是1+2没有进行计算,那x是一个什么形参?他的形参类型是什么?挖坑这边没搞懂! 。
最好的方式是第二种解决办法,在进行结构体中,对形参打上括号这样不会出现问题。
3.2#define定义函数中有形参之防不胜防
先看代码
#include <stdio.h>
#include <stdlib.h>
#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,肯定。
看看运行结果
运算结果:
问题出在哪?
#define定义的函数,还是把他理解成函数的定义和调用,应该理解成只是替换。
那这个题,计算机在计算机的角度,ta是怎么算的。
9/(2+1)*(2+1)
结果是等于9.
程序中应该怎么更改,输出1.
printf("RESULT是:%d\n",9/(RESULT(2+1))); //或 #define RESULT(x) ((x)*(x))//推荐这种方法
结论:
#define RESULT(x) ((x)*(x))//推荐这种方法
在运用#define 定义函数并且有形参的时候,形参有括号以及结构体要有括号,避免犯错。
其他作者把((x)*(x))这个叫做字符串,大家也可以理解理解。
参考总结:
1.C语言 define 定义函数 - C语言零基础入门教程 - 猿说编程 - 博客园//感觉作者写的真不错