【C】宏定义拓展

唉,还是要拓展一下宏定义,不能只知道#define PI 3.14乐。

第一个例子,"##"

#include <stdio.h>
#define f(g,g2) g##g2
int main(){
    int var12=100;
    printf("%d",f(var,12));
    return 0;
}
//运行结果:100
  1. #define f(g,g2) g##g2:这是一个宏定义。## 是预处理器运算符,用于将两个符号连接成一个新的符号。在这里,宏 f(g,g2) 接受两个参数并将它们连接在一起。
  2. printf("%d", f(var,12));:这行代码使用了 printf 函数来打印一个整数。f(var,12) 是宏展开后的结果。根据宏定义,f(var,12) 展开为 var12,因为 gvarg212,而 ## 运算符将它们连接在一起。所以最终,后面就是变量var12。

第二个例子,表达式

#include <stdio.h>
#define prod(a,b) a*b
int main(){
    int x=3,y=4;
    printf("%d",prod(x+2,y-1));
    return 0;
}
//运行结果:10

代入时,仅是文本替换,没有括号!

例如这道题替换后就是x+2*y-1,所以结果就是10。

第三个例子,究极套娃表达式

#include <stdio.h>
#define f(a,b,x) a*x+b
int main(){
    printf("%d,%d",f(1,2,3),f(f(1,2,3),4,2));
    return 0;
}
//运行结果:5,11

要点:千万不要把里面的f(1,2,3)算出结果,直接文本替换!

第四个例子,重定义

#include <stdio.h>
#define a 10
int main(){
    #define a 50
    printf("%d",a);
    return 0;
}
//运行结果:50

虽然说这样写编译器会警告重定义,但是运行结果是由最近的宏定义决定的。

第五个例子,文字替换最逆天的一集

#include <stdio.h>
#define scanf "%s ABC"
int main(){
    printf(scanf, scanf);
    //printf("%s ABC", "%s ABC");
    return 0;
}
//运行结果:%s ABC ABC

自行体会

© 版权声明
THE END
点赞12 分享
评论 共2条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复
    • 头像xccc6661