define、enum、const
1.#define MAX 10------c语言定义符号常量
#define指令指定一个符号名称代表一个常量,类型无关。定义符号常量时应“见名知意”。能做到“一改全改”。这是预编译指令,他只是用符号常量代表一个字符串,在预编译只进行字符替换,在预编译后,符号常量就不存在了。(不分配存储单元,只是一个临时符号,无类型)
注意:
A
#define sum(a,b) a*b=>((a)*(b))
void main ()
{
int x=3,y=5;
printf("%d\n",sum(x+6,y+4)); / /3+6*5+4=37=>(3+6)*(5+4)=81
}
B
#define MAx(a,b) ((a)>(b)?(a):(b))
void main ()
{
int a=6 ,b=5;
MAx(++a,b); / / ((++a)>(b)?(++a):(b))
printf("%d",a); / /a=8
}
#define PI 3.14
void main()
{
double r=10,s=10;
s=r*r*PI; / /正确
}
当把PI放前面
s=PI*r*r;==>s=3.14 ;*r*r ; / /编译失败
比较以下两者的区别
1. #define MAx(a,b) ((a)>(b)?(a):(b))
2. int Max(int x,int y)
{
return x>y?x:y;
}
区别:1.#define预编译直接替换,而函数是调用,define速度更快
2.函数有类型要求
3.define有副作用,形参的改变带动实参的改变
拓展:
#undef 取消一个宏的定义,之后这个宏所定义的就无效;但是可以重新使用#define 进行定义。
#define YHP
#ifdef YHP //(如果定义YHP则A,否则B) / /#ifndef (如果未定义YHP则A,否则B)
#define A
#else
#define B
#endif
例:
#include<stdio.h>
#define YHP
#if YHP 0 //YHP后必须赋值,无值编译不通过
==>1
#define Max 100
#else
#define Max 10
#endif
void main ()
{
printf("%d \n", Max);//==>10 ==>100
}
2.enum(MAX=10)------枚举型常量(不开辟空间)
A. 枚举值是常量,不是变量。不能在程序中用赋值语句再对它赋值
B.枚举元素本身由系统定义了一个表示序号的数值,从0开始顺序定义为0,1,2…。
enum status{ ok=0, error=3,num}==>num=4
C.只能把枚举值赋予枚举变量,不能把元素的数值直接赋予枚举变量
D.枚举元素不是字符常量也不是字符串常量,只能代表整型量,不能用浮点数
E.枚举的sizeof,就是某个能容纳其范围的整型的sizeof,但不会大于sizeof(int),枚举类型的值不能超过 int
例:
enum status{ ok=0,error=3}
void main()
{
int a=0;
status b; / /sizeof(b)=4
b=ok; / /b=0(错误) b=3(错误)
b=error; / /b++(错误)b+=1(错误)
}
3.const int max=10----定义常变量
常变量有类型,要占用存储单元,有变量值,只是该值不改变,在编译时拿值替换
例1.
int a=10,b=20;
int *p1=&a; / /(*p1自由,可以被改变,&a是a的地址不可被改变)
const int *p2=&a; / /(p2本身可以被改变,但是*p2不能被改变)
int *const p3=&a; / /(*p3可以改变,但是p3本身不能被改变)
const int *const p4;/ /(*p4不能被改变,p4也不能被改变)
例2.
const int a;
void main ()
{
const int b;
}//不能编译通过
const 定义的变量必须初始化,不论是在全局还是在局部。
3.
区别以下二者(就近原则)
const int a=10;
void main ()
{
const int a=20;
printf("%d",a); printf(“%d”,::a);// ::作用域标识符,打印全局变量a
}
==>a=20 ==>a=10
const int a=10;
void main ()
{
printf("%d",a);
const int a=20;
}
==>a=10
4.
void mian()
{
const int a=10;
int b=0;
int *p=(int*)&a;
*p=100;
b=a;
printf("a = %d\n",a);
printf("b = %d\n",b);
printf("*p = %d\n",*p);
}
==>
a=10
b=10
*p=100