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


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值