变量、常量 的区别

变量之所以重要,是因为变量是编程语言中数据的符号标识和载体。

变量是内存或寄存器中用一个标识符命名的存储单元,可以用来存储一个特定类型的数据,并且数据的值在程序运行过程中可以进行修改。可见,变量首先是一个标识符或者名称,就像一个客房的编号一样,有了这个编号我们在交流中就可方便言表,否则,我们只可意会,那多不方便。为了方便,我们在给变量命名时,最好能符合大多数人的习惯,基本可以望名知义,便于交流和维护;其次,变量是唯一确定的对应内存若干存储单元或者某个寄存器。这些是编译器来保证的,用户一般不用费心。

程序员一旦定义了变量,那么,变量就至少可为我们提供两个信息:一是变量的地址,即就是,操作系统为变量在内存中分配的若干内存的首地址;二是变量的值,也就是,变量在内存中所分配的那些内存单元中所存放的数据。

由于程序的多样需要,我们对变量也有各种各样的要求,比如:变量的生命期,变量的初始状态,变量的有效区域,变量的开辟地和变量的开辟区域的大小等等;为了满足这些要求,C语言的发明者就设置了以下变量:

1、 不同数据类型的变量;如:char cHar, int iTimes, flaot faverage;

2、 全局变量或者叫全程变量;

3、 局部变量;

4、 静态变量: 静态全局变量和静态局部变量;关键词:static

5、 寄存器变量;关键词:register;

6、 外部变量: 关键词:extern;

C语言中,变量在内存中开辟地的大小由数据类型决定的,由于PC机中规定一个地址单元存一个字节,不同的数据类型的变量,为其分配的地址单元数是不一样的。C语言中除几种基本的数据类型外用户还可以自己定义所需要的数据类型:

1、 bool型 sizeof(bool): 1

2、 char型: sizeof(char): 1

3、 short型: sizeof(short): 2

4、 int型: sizeof(int): 4

5、 long型: sizeof(long): 4

6、 float型: sizeof(float): 4

7、 double型: sizeof(double): 8

8、 自定义型:如:

typedef struct tagMyData

{

 char     cHar;

 int      iTimes;

 float    faverage;

}MyDatap;

sizeof(MyDatap): 12

char szBuf[]=”HELLO C&C++!”;

sizeof(szBuf): 13

局部变量和全局变量是相对而言的;如下:局部变量 int itmp;

                 int Get_Max( const int& x, const int& y, const int& z )

                 {

                        int itmp;

                        if(x > y) itmp = x;

                        else itmp = y;

                        if( itmp > z ) return itmp;

                        else  return z;

                 }

在函数内部说明的变量为局部变量,只有在函数执行时,局部变量才存在,当函数执行完退出后,局部变量随之消失。也就是,当函数执行完退出后,原先在函数内定义的变量现在不能用,这通常由编译器保证,它会阻止编译通过。也就是说,原来为那个局部变量分配的内存,现在已经不属于它,它再无权访问了。如要再使用这些内存单元就必须从新定义变量来申请,只有分配给的变量才可访问它。否则,就会出错,如数组越界访问。

与局部变量不同,全局变量在整个程序都是可见的,可在整个程序运行过程中,对于任何一个程序都是可用的。全局变量的说明的位置在所有函数之外,但可被任何一个函数使用,读取或者写入。如下:全局变量 int iCount, bool bForward;

                 int iCount;           //全局变量;

                 bool bForward;  //全局变量;

                 void add( void );

                 void dec( void );

                 void man(void )

                 {

                        while( iCount < 1000 && iCount > -1000)

                        {

                               add( );

                               dec( );

                               printf("COUNT:%d;\n", iCount)

                        }

                 }

                 void add( void )

                 {

                        if( bForward ) iCount++;

                 }

                 void dec( void )

                 {

                        if(!bForward ) iCount--;

                 }

可见,全局变量非常方便不同函数间数据共享,同样,任何函数在在使用数据时,都不敢保证数据是否已被修改。如果程序员无法保证这个,就尽量避免使用全局变量。

静态变量是分配在存储器中C程序所占据的数据段内, C程序运行的整个过程中一直保留,不会被别的变量占用。静态变量可以定义成全局变量或局部变量,当定义为全局变量时,在它定义的程序的整个运行期间均存在并且保持原来的存储单元位置不会改变。那么既然有了全局变量为什么还要定义全局静态变量呢?看下边的示例:

模块1:

int a;

static int b;

void fun1( void )

{

   ……

   fun2( );

   ……

   }

模块2:

   extern int a;

   satic int b;

   void fun2(  void  )

   {

          ……

          fun1( );

          ……

   }

分别编译,然后链接两个模块。。。。。。

模块1和模块2中,变量a为同一个变量;而变量b就不是同一个变量!虽然它们的的数据类型和名称均相同;就是因为有static;原因是,如果在全局变量说明前加上静态变量说明符static,它就会通知编译器该全局变量只在被定义的这个文件或模块中可见的。就是说,该静态全局变量在其他文件中是不可见的,在其他文件中的程序是不允许访问的。这在一定程度上减少了全局变量的副作用的影响。

同静态全局变量定义一样,当在局部变量名前加静态变量说明符static,该变量就定义为静态局部变量。编译器为该变量建立永久存储单元。永久是指C程序运行的整个过程中一直保留,不会被别的变量占用。静态局部变量和静态全局变量的根本区别在作用区域上,静态局部变量只在它被说明的函数或复合语句中有效,并且在两次函数调用期间仍然保存其值不变,即就是有记忆功能;它们的生命期是相同的,和C程序整个运行期同在。如下例:

void counts(void);

void countd(void);

int main(int argc, char* argv[])

{

   int i = 0;

   while( i++<10)

   {

          counts( );    //使用静态局部变量

   }

   i = 0;

   while( i++<10)

   {

          countd( );    //使用局部变量

   }

return 0;

}

void counts(void) //使用静态局部变量

{

   static int isc ;      //未赋初值;

   isc++;

   printf("dsc = %d;\n", dsc);

}

void countd(void) //使用局部变量

{

   int idc = 0;

   idd++;

   printf("idc=%d;\n",idc);

}

执行结果为:

          isc = 1;      //使用静态局部变量

          isc = 2;

          isc = 3;

          isc = 4;

          isc = 5;

          isc = 6;

          isc = 7;

          isc = 8;

          isc = 9;

          isc = 10;

          idc = 1;       //使用局部变量

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

          idc = 1;

通过以上程序你也看得出:

1、 局部变量和静态局部变量的区别:记忆功能;

2、 静态局部变量只初始化一次,并且默认初始化为0;

静态变量在定义时若未被赋值,则编译程序将其初始化为0;

寄存器变量不像其他变量那样在内存中存放数据,而是在CPU的寄存器中暂存数据,使用寄存器变量比使用内存变量的操作速度快得多。只有整型和字符型变量可定义为寄存器变量。定义方式如下:

                 register int iTemp;

由于CPU中寄存器有限,尽量减少使用数量和和占用时间,用完马上释放;不能定义为全局变量,也不能定义在结构或者类中。

为了大型程序的管理,将一个大型的程序分成若干个独立的模块和文件分别编译,然后统一链接在一起。为了解决全局变量和函数的共用问题,就引入了extern关键字。这样只需在一个文件中定义全局变量和函数,在另一个文件中要用到这些变量和函数时,只需将那个文件中的变量和函数说明表复制过来,在前面加上extern,告诉编译器,这些变量和函数已经在别的文件中定义说明,在此不必再定义说明了。

区别:1.常量是定义时可以对其设置值(数值常量除外),而在其后的任
何时刻都不可以改变其值的量。
2. 变量是可以在定义后的任何时刻改变其值的量
3.常量是在程序运算过程中不变的量。 常量在程序中经常直接
出现,如123、3.14159、‘a’、“computer”,此时只要求它们符合相应类型数据的表示方法。

变量的细分:

相应于各种数据类型,有整型常量、浮点型常量、字符型常量及字符串常量。 常量定义是指定义符号常量,用一个标识符来代表一个常量,通过宏定义预处理指令来实现。 格式:#define 标识符常量 由用户命名的标识符是符号常量名。作为符号常量名,一般大写。一旦定义,在程序中凡是出现常量的地方均可用符号常量名来代替。 对使用了符号常量的程序在编译前会以实际常量替代符号常量

定义变量 :int a;
定义符号常量:#define PI 3.1415926 //注意后面没有分号
定义常变量 :const float PI=3.1415926;

区别:

变量:的特征是存在一个以变量名命名的存储单元,在一般情况下,
存储单元中的内容是可以变化的。
常变量:在变量的基础上加了一个限定:存储单元中的内容不允许变化
仍然是有存储单元的。

符号常量:是使用一个字符串代替程序中出现的一个标识符,是编译时把
所有的符号常量都替换成制定的字符串,在内存中也不存在一
符号常量命名的存储单元。在其作用域内其值不能改变和赋
值。

问题:const变量 (常变量,也叫“只读变量”)与 常量

为什么我象下面的例子一样用一个const变量来初始化数组,ANSI C的编译器会报告一个错误呢?

const int n = 5;
int a[n];

答案与分析:

1)、这个问题讨论的是“常量”与“只读变量”的区别。常量肯定是只读的,例如5, “abc”,等,肯定是只读的,因为程序中根本没有地方存放它的值,当然也就不能够去修改它。而“只读变量”则是在内存中开辟一个地方来存放它的值,只不过这个值由编译器限定不允许被修改。C语言关键字const就是用来限定一个变量不允许被改变的修饰符(Qualifier)。上述代码中变量n被修饰为只读变量,可惜再怎么修饰也不是常量。而ANSI C规定数组定义时维度必须是“常量”,“只读变量”也是不可以的。

2)、注意:在ANSI C中,这种写法是错误的,因为数组的大小应该是个常量,而const int n,n只是一个变量(常量 != 不可变的变量,但在标准C++中,这样定义的是一个常量,这种写法是对的),实际上,根据编译过程及内存分配来看,这种用法本来就应该是合理的,只是 ANSI C对数组的规定限制了它。

3)、那么,在ANSI C 语言中用什么来定义常量呢?答案是enum类型和#define宏,这两个都可以用来定义常量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值