c语言与c++中const的区别

来源:互联网 发布:js document 创建标签 编辑:程序博客网 时间:2024/06/06 01:08

首先声明一下:const的不同是由于编译器对const的处理方法不同造成的。因此,我们所接下来所说的差异是分别针对c89c++99版本的编译器。

1、 c语言中的const

                #include<stdio.h>
               void main()
               {

const int a = 10;

//int arr[a] = { 0 };  不能用a作为数组下标

//a = 20;  //不能进行直接修改

printf("修改前a=%d\n", a);

int *p = &a;

*p = 20;

printf("修改后a=%d\n",a);

            }

                       


可以看出,在c语言中,const 修饰的变量是常变量,它的性质还是属于变量,只不过是具有常性的变量,也就是说:(1)它不能通过直接作为左值的方式来进行修改;

       (2)在编译过程中,与变量一样的方式处理;

       (3)它还是属于变量,因此不能作为数组的下标;

      (4)虽然不能直接直接修改a的值,但是可以通过获取a的地址来间接修改。

2、 c++中的const

#include<iostream>

using namespace std;

int main()

{

const int a = 10;

//const int b; 必须初始化

int arr[a] = { 0 };

//a = 20;

cout << "修改前a=" << a << endl;

int *p = (int*)&a;

*p = 20;

cout << "修改后a=" << a << endl;

return 0;

}

                           

可以看出,在c++中,const 修饰的变量是常量,它也就具有常量的性质。那么

(1)它不能通过直接作为左值的方式来进行修改;

(2)它可以作为数组下标使用;

(3)它必须被初始化;

(4)在编译过程中,所有使用a的地方会被替代成10;(c++编译器对const常量的处理当碰到常量声明时,在符号表中放入常量;编译过程中若发现使用常量则直接以符号表中的值替换)

但是有时它也会退化为常变量,比如:

                                            int  c=10;

                                            const int a=c;//当被初始化为变量时

注意如何解释取地址

编译过程中若发现对const使用了extern或者&操作符,则会对应的常量分配存储空间(为了兼容c)。c++编译器虽然可能为const常量分配空间(进行&运算时),但是不会使用其存储空间中的值。


结论

C语言中const常(变)量:其是只读变量,有自己的储空间,能通过地址间接修改其的值。

C++中的const常量:其是放在符号表中,可能分配存储空间,也可能不分配存储空间 ,使用&符号时候才分配一个临时内存空间。