64,654
社区成员
发帖
与我相关
我的任务
分享
const double Pi=3.14159;
double i=Pi;
double j=Pi;
cout<<&i<<" "<<&j<<endl;
const double x =12.5+100;// 类型是 double ,值为 12.5+100 =112.5
#define X 12.5+100 //X 被替换成 12.5+100 是原样替换,没有类型和值的任何信息。
例如 :
double a = X*8 ; //替换成
double a = 12.5 +100 * 8 ; //a=812.5
double b =x*8 ;//计算结果为 112.5 *8 = 900.0
编译器知道 x 是什么
但是并不知道 X是什么,只有替换后,才编译替换后的代码。
X 可能会分成几个部分,参与计算,也可能是个非法表达式
如果
const double x="123456"; //编译器会直接报告,这地方初始化错误
。。。。。。。。。。
double a =x;//
如果是
#define X “123456” //这个定义错不错,编译器都无法知道。
//。。。。。。。。。
double a =X;//编译器到这里,才能发现,错误。
所以,定义常量
const 常量,
跟宏常量比较起来,
是有类型安全的优势的,有类型错误,可以直接指出,出错位置。
宏定义,就很难发现这种错误了。
#define N 100
#define Name "C language"
一般用于定义宏常量
也可用于,其他方面,用途广泛
2)带参数的宏。 可以执行宏替换,作用相当于函数。
#define func() { printf("12345");}
#define func_a( a) { primr(“%d”,a);'}
#define max(a,b) ((a)>(b) ?(a):(b))
这种宏,一般有括号,(其实空的参数,也可以)
这种宏,和函数最显著的区别是不能检查,参数类型是否合法,返回值类型是否合法。
所以被认为是类型不安全的。
其他区别也还有,但是这种区别最大,最明显。