C语言——小细节和小知识4

一、#define宏定义

格式:

#define 宏名 宏体

例如:

#include 
#define PI 3.14

int main()
{
	int x = 2;
	double y = x + PI;
	printf("%lf",y);
	return 0;
}

运行结果:

宏定义在调用时是只替换不计算,例如下面的例子:

#include 
#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 
#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 

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)或者其他适当的数据类型来避免潜在的问题。

你可能感兴趣的:(c语言)