熟悉预处理标识符:
//__LINE__
//__LINE__
//__FILE__
//__DATE__
//__TIME__
#include<stdio.h>
int main()
{
int i=0;
for(i=0; i<10; i++)
{
printf("file%s\tline%d\tdate%s\ttime%s\t",
__FILE__,__LINE__,__DATE__,__TIME__);
}
return 0;
}
#include<stdio.h>
#define PRINT(n) \
printf("num" #n " = %d",num##n)
int main()
{
int num4=4;
PRINT(4);
return 0;
}
2.了解宏和函数的区别。
(1)在宏定义较短执行次数较多时,一般来说宏的效率会比较高
(2)宏定义如果较长时,在函数中多次使用会使得源代码变长
(3)宏定义时不区分定义的类型,函数需要区分参数类型
#include<stdio.h>
#define SUM(X) ((X)+(X))
int main()
{
int n=10;
float m=3.1;
int ret1=0;
int ret2=0;
ret1=SUM(n);
ret2=SUM(m);
printf("ret1=%d\n",ret1);
printf("ret2=%f\n",ret2);
return 0;
}
int Max1_int(int x, int y)
{
return x>y?x:y;
}
float Max2_float(float x, float y)
{
return x>y?x:y;
}
int main()
{
int n1 = 10;
int n2 = 20;
float m1 = 3.1f;
float m2 = 4.3f;
int ret1=0;
float ret2=0;
ret1=Max1_int(n1,n2);
ret2=Max2_float(m1,m2);
printf("ret1=%d\n",ret1);
printf("ret2=%f\n",ret2);
return 0;
}
3.写一个宏可以将一个数字的奇数位和偶数位交换
(1)算法分析:将所给的数字通过不断的右移与1,所得到的结果在和每次左移的数字相或,所得到的值就是交换后的数字
int main()
{
int num = 15;
int i = 0;
int ret = 0;
for(i=0; i<32; i++)
{
ret = ret<<1;
ret =ret |((num>>i)&1);
}
printf("%u\n", ret);
return 0;
}
#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#define CHANGE_SITE \
for(i=0; i<32; i++){ \
ret = ret<<1; \
ret =ret | ((num>>i)&1); \
}
int main()
{
int num = 15;
int i = 0;
int ret = 0;
CHANGE_SITE;
printf("%u\n", ret);
return 0;
}