一、#define宏定义
格式:
#define 宏名 宏体
例如:
#include <stdio.h>
#define PI 3.14
int main()
{
int x = 2;
double y = x + PI;
printf("%lf",y);
return 0;
}
运行结果:
宏定义在调用时是只替换不计算,例如下面的例子:
#include <stdio.h>
#define NUM 3.14 + 2
int main()
{
int x = 2;
printf("%lf",x * NUM );
return 0;
}
实际上这里的x * NUM中的NUM是被替换成了3.14 + 2,并没有计算,所以x * NUM是变成了x * 3.14 + 2,也就是2 * 3.14 + 2,所以结果是8.28.
又如:
#include <stdio.h>
#define ADD(x,y) x * y
int main()
{
int x = 2,y = 3;
printf("%d",ADD(x + 2,y));
return 0;
}
运行结果:
这里也是只替换不运算,将2,y替换成了2 * y,所以原式就变成了x + 2 * y,结果是8。
二、整型数据
我们知道int类型的范围是-32768 ~ 32767,而10!是3628800,
明显10!的大小不在int类型范围内,可是为什么下面的程序运行结果是正确的呢?
#include <stdio.h>
int main()
{
int i = 1,factorial = 1;
for (i = 1; i <= 10; i++)
{
factorial = factorial * i;
}
printf("%d",factorial);
return 0;
}
原因是:虽然变量factorial的值超出了int类型的范围,但是在一些编译器中,int类型可能会自动转换为长整型(long int)类型,以容纳更大范围的整数。这种行为被称为整数提升(integer promotion)。因此,即使超出int范围,有些编译器仍可以正确打印这个结果。但是,为了编写更具移植性的代码,建议在计算可能超出int类型范围的值时,选择使用长整型(long int)或者其他适当的数据类型来避免潜在的问题。