您当前的位置: 首页 > 学无止境 > 心得笔记 网站首页心得笔记
051第九章 预处理02(新版)
发布时间:2021-05-05 17:59:22编辑:雪饮阅读()
有参宏的实现
宏也可以定义有参数的
#include <stdio.h>
#define MAX(a,b) (a>b)?a:b
void main()
{
int x, y, max;
printf("input two numbers: ");
scanf("%d %d", &x, &y);
max = MAX(x, y);
printf("The max is %d\n\n", max);
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
input two numbers: 1 2
The max is 2
还可以看看如下实例:
#include <stdio.h>
#define SAY(y) (y)
void main()
{
int i = 0;
char say[] = {73, 32, 108, 111, 118, 101, 32, 104, 105, 115, 104, 99, 46, 99, 111, 109, 33, 0};
while( say[i] )
{
/*
这里相当于say[i]=(say[i]*1+1-1);
*/
say[i] = SAY(say[i]*1+1-1);
i++;
}
printf("\n\t%s\n\n", say);
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
I love hishc.com!
这里需要注意的是:始终要记住宏只是字符串替换的思想。
同样的例如下面的程序:
#include <stdio.h>
#define SQ(y) (y)*(y) // y*y试试
void main()
{
int a, sq;
printf("input a number: ");
scanf("%d", &a);
sq = SQ(a+1); // sq = a+1 * a+1
printf("sq = %d\n", sq);
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
input a number: 2
sq = 9
在我看来这些都是c语言的一些陷阱。
一不留神一不注意就有可能被陷入进去了。
那么同样的如:
#include <stdio.h>
#define SQ(y) ((y)*(y))
void main()
{
int a, sq;
printf("input a number: ");
scanf("%d", &a);
sq = 160 / SQ(a+1); // sq = 160 / ((a+1) * (a+1));
printf("sq = %d\n", sq);
}
D:\cproject>gcc main.c -o m
D:\cproject>m.exe
input a number: 1
sq = 40
字符串串的清空妙用
把NULL也放进来一起说说。
'\0'、0、NULL这三者的真值都是0,没有任何区别。之所以有三种写法,完全是为了程序的阅读:当用'\0'时表示是在操作一个字符串的结束符,比如ch!='\0';用NULL时常常是在将一个指针置为“空”指针,比如int *p=NULL;而0自然是数字0了,如int c=0。但写成int *p='\0'、int c=NULL和ch!=0都是能正确编译的。所以只是代码风格问题,没有实质区别。
'\0'、0、NULL这三者的真值都是0,没有任何区别。之所以有三种写法,完全是为了程序的阅读:当用'\0'时表示是在操作一个字符串的结束符,比如ch!='\0';用NULL时常常是在将一个指针置为“空”指针,比如int *p=NULL;而0自然是数字0了,如int c=0。但写成int *p='\0'、int c=NULL和ch!=0都是能正确编译的。所以只是代码风格问题,没有实质区别。
这里清空字符串就是利用了字符数组以\0结尾来欺骗计算机的方法
#include <stdio.h>
#include <string.h>
#define STR(s1, s2, s3, sum) strcat( strcat( strcat(sum, s1), s2 ), s3)
void main()
{
char str1[] = "I ", str2[] = "love ", str3[] = "xkws.com!", str[40] = "";
STR(str1, str2, str3, str); // strcat( strcat( strcat(str, str1), str2 ), str3)
printf("\n\tstr1 = %s\n\tstr2 = %s\n\tstr3 = %s\n\tStr = %s\n\n\n", str1, str2, str3, str);
/*
str[0]=0
就是清空字符串
因为0相当于字符数组的结束
\0空白字符
所以还可以写成str[0] = '\0';
*/
str[0] = '\0';
STR(str2, str1, str3, str);
printf("\n\tstr1 = %s\n\tstr2 = %s\n\tstr3 = %s\n\tStr = %s\n\n\n", str1, str2, str3, str);
}
关键字词:预处理,真值,清空字符串
上一篇:050第九章 预处理01(新版)
下一篇:052第九章 预处理03(新版)