喜迎
春节

宏定义


1.不带参数的宏定义

#define PI 3.14 将文中的所有的PI替换为3.14

#define PI 3.1415926

float radius = 2.0;
float area = PI * radius * radius;
#define PI 3.1415926

float radius = 2.0;

#undef PI    // 这时就会报错,宏定义终止了。

float area = PI * radius * radius;
宏定义的嵌套
#define PI 3.1415926
#define R 6
#define S = PI * R * R
int mian()
{
    printf("%d",S) ;
}

2.带参数的宏定义

==宏定义仅仅是替换==

#define MAX(x,y) (((x) > (y)) ? (x) : (y)) 

int main(void)
{
    int x, y ;
    printf("输入两个整数\n");
    scanf("%d%d",&x,&y) ;
    printf("%d 是较大的那个数\n",MAX(x,y)) ; 

}

这样看,宏定义与函数看着有点相似,但是不同

  • 宏定义只是机械的替换,不需要定义参数的类型
  • 函数的参数不同,是形参和实参,通过栈进行传输的。变量,需要指定类型。

==注意== 在使用带参数的宏定义时,定义的时候就要按照顺序加括号,不然会因为优先级的问题而出错。

要牢记宏定义只是替换,跟函数是不一样的。
案例:

#define SQUARE(x) ((x) *(x))
int square(int x)
{
    return x*x ;
}
int main(void)
{
    int i = 1 ;
    while(i <= 100)
    {
        printf("%d的平方是%d\n",i-1,square(i++)) ;  //使用函数计算的结果是正常的
        // 执行顺序是从右到左的。

         printf("%d的平方是%d\n",i-1,SQUARE(i++)) ;  // 使用宏定义,结果是错误的。
    }
}

宏定义的错误结果:

因为宏定义的SQUARE
相当于
((i++)*(i++)) 加了两次,所以结果是错误的


文章作者: ljhaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ljhaa !
评 论
 上一篇
结构体
结构体
1.结构体(个人理解,结构体跟java中的类差不多) 可以理解为结构体是类的原形,毕竟c比java早诞生。 类似于类,但是不是类,因为c是面向过程编程,java是面向对象编程,两者之间是有差别的 可以在main函数中也可以在 main函数外
2023-05-02
下一篇 
内存管理
内存管理
1.内存管理1.1更灵活的内存管理方式加载对应的库函数就可以申请动态的内存 对应的头文件#include<stdlib.h> 1.2 malloc malloc 函数原型:void *malloc(size_t size) ;
2023-05-02
  目录