🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀
目录
🐰 计算机语言的发展
🐰预处理
1.头文件的包含
2.注释的删除
3.#define定义的符号替换
预处理指令
#define
#include
...
🏡预处理的详解
预定义符号:
__FILE__进行编译的源文件
__LINE__文件当前的行号
__DATE__文件被编译的日期
__TIME__文件被编译的时间
__STDC__如果编译器遵循ANSI C,其值为1,否则未定义(可以判断编译器是否遵循标准C)
注意:其实编译器在编译的时候,会对函数和变量名重命名的,在C语言中重命名的规则基本就是:加_
1. #include<stdio.h> 2. int main() 3. { 4. int arr[]={1,2,3,4,5,6,7,8,9,10}; 5. for(int i=0;i<10;i++) 6. { 7. //显示每个元素的存储位置 存储的日期 存储时间 8. printf("%d-->%s %s %s %d",arr[i],__FILE__,__DATE__,__TIME__,__LINE__); 9. printf("\n"); 10. } 11. return 0; 12. } 13. 结果: 14. 1-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 15. 2-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 16. 3-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 17. 4-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 18. 5-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 19. 6-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 20. 7-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 21. 8-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 22. 9-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567 23. 10-->/Users/bicaihua/Desktop/编码/4-12/2023_3_29_1/2023_3_29_1/2023_4_1.c Apr 2 2023 20:46:03 567
判断编译器是否遵循标准C:
1. #include<stdio.h> 2. int main() 3. { 4. printf("%d\n",__STDC__); 5. return 0; 6. } 7. 运行结果: 8. 1 9. 说明Xcode是遵循标准C的
🌸#define定义标识符
1. #define c int 2. //就是将int 替换为c 3. #define MAX 1000 4. //MAX为常量 5. //注意:#define 定义标识符后面不要加分号 6. #include<stdio.h> 7. int main() 8. { 9. c a=9; 10. printf("%d\n",MAX+a); 11. return 0; 12. } 13. 结果: 14. 1009
🌸#define定义宏
允许把参数替换到文本中,这种实现通常称为宏或定义定义宏
宏的声明方式:
#define name(parameent-list) stuff
其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中
注意:
参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符)
例如:
1. #define定义宏 2. 允许把参数替换到文本中,这种实现通常称为宏或定义定义宏 3. 宏的声明方式: 4. #define name(parameent-list) stuff 5. 其中的parameent-list是一个由逗号隔开的符号表,它们可能出现stuff中 6. 7. 注意: 8. 参数列表的左括号必须与name紧邻,如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。(就会是#define 定义标识符) 9. 例如: 10. #include<stdio.h> 11. #define SQUARE(x) x*x //这个宏:计算数的平方 12. int main() 13. { 14. printf("%d\n",SQUARE(8)); 15. //结果:64 16. printf("%d\n",SQUARE(1+7)); 17. //结果:15 18. //宏的参数不进行任何计算替换到宏的体内。1+7*1+7 19. //如果想要改正确:#define SQUARE(x) ((x)*(x)) 20. return 0; 21. } 22. 23. 用宏和函数分别来求最大值 24. #include<stdio.h> 25. #define MAX(a,b) (a)>(b)?(a):(b) 26. int Max(int a,int b) 27. { 28. return a>b?a:b; 29. } 30. int main() 31. { 32. int m=MAX(2,3); 33. int n=Max(2,3); 34. printf("%d %d\n",m,n); 35. return 0; 36. } 37. 结果: 38. 3 3
🌸#define替换规则
在程序扩展#define定义符号和宏时
1.在调用宏时,首先对参数进行检查,看看是否包含任何由#define定义的符号。如果是,它们首先被替换。
2.替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替换。
3.最后,再次对结果文件进行扫描,看看他是否包含任何由#define定义的符号。如果是,就重复上述过程。
注意:
1.宏参数和#define定义中可以出现其他#define定义的符号。但是对于宏,不能出现递归
2.当预处理器搜索#define定义的符号的时候,字符串常量的内容不被搜索。
🌸#和##
#的作用
#把一个宏参数变成对应的字符串(就是替换为变量名)
例如:
1. #include<stdio.h> 2. #define print_format(num,format) printf("the value of " #num " is " format,num)//#num 把一个宏参数变成对应的字符串(就是替换为变量名) 3. int main() 4. { 5. //这里的代码显得有点冗余,用函数无法做到精简 6. int a=10; 7. printf("the value of a is %d\n",a); 8. int b=20; 9. printf("the value of b is %d\n",b); 10. float c=30; 11. printf("the value of b is %f\n",c); 12. 13. //使用宏来解决冗余的问题 14. a=40; 15. print_format(a,"%d\n"); 16. b=50; 17. print_format(b, "%d\n"); 18. c=3.14; 19. print_format(c, "%.2lf\n"); 20. return 0; 21. } 22. the value of a is 10 23. the value of b is 20 24. the value of b is 30.000000 25. the value of a is 40 26. the value of b is 50 27. the value of c is 3.14
##的作用
##可以把位于两边的符号合成一个符号,它允许宏定义从分离的文本片段创建标识符
注意:这样的连接必须产生一个合法的标识符,否则其结果就是为定义的
例如:
1. #include<stdio.h> 2. int Class110=2023; 3. #define CAT(x,y) x##y 4. int main() 5. { 6. printf("%d\n",CAT(Class,110));//预编译的时候CAT(Class,110)替换为Class110 7. return 0; 8. } 9. 结果: 10. 2023
🌸#define定义宏的小问题
1. #include<stdio.h> 2. #define MAX(a,b) (a)>(b)?(a):(b) 3. int Max(int a,int b) 4. { 5. return a>b?a:b; 6. } 7. int main() 8. { 9. int a=3; 10. int b=5; 11. int c=MAX(a++, b++);//调用宏 12. //int c=(a++)>(b++)?(a++):(b++); 13. //(1)c=3>5?3:6 a=3 b=6 c=6 14. //(2)a++(前面的a++)=3+1 b++(后面的b++)=6+1 c=c=6 15. //(3)a=4 b=7 c=6 16. printf("a=%d b=%d c=%d\n",a,b,c); 17. a=3; 18. b=5; 19. c=Max(a++, b++);//调用函数 20. printf("a=%d b=%d c=%d\n",a,b,c); 21. return 0; 22. } 23. 结果: 24. 宏:a=4 b=7 c=6 25. 函数:a=4 b=6 c=5
🌸左值与右值
1. int a=10; 2. a=20;//这里使用的是a的空间,我们说的a是右值 3. int c=a;//这里使用的是a中存放的数据,我们说的a是左值
🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸