• C/C++文字常量与常变量的概念与区别 分类: C/C++ 2015-06-10 22:56 111人阅读 评论(0) 收藏


    以下代码使用平台是Windows 64bits+VS2012。

    在C/C++编程时,经常遇到以下几个概念:常量、文字常量、符号常量、字面常量、常变量、字符串常量和字符常量,网上博客资料也是千篇千律,不尽相同,弄得大家云里雾里。本文将尝试为大家捋清楚以上易混淆概念的定义,关系和区别。

    常量指值不可改变的量。在C/C++中常量分为两种:文字常量(Literal constant)和常变量(constant variable)。
    文字常量和常变量的本质区别:文字常量编译之后存储在代码区,不可寻址,常变量存储在数据区,可寻址。

    1.文字常量

    文字常量又称为“字面常量”,包括数值常量字符常量符号常量。其特点是编译后写在代码区,不可寻址,不可更改,属于指令的一部分。

    int& r=5;//编译错误

    这条语句出现编译错误,原因是文字常量不可寻址,因而无法为文字常量建立引用。
    下面这条语句又是合法的:

    const int& r=5;

    原因是编译器将一个文字常量转化成常变量的过程。在数据区开辟一个值为5的无名整型常变量,然后将引用r与这个整型常变量进行绑定。

    数值常量:包括整型常量和实型常量。整型常量就是指常整数,有十进制、八进制、十六进制三种表示形式。实型常量只采用十进制小数形式和指数形式表示,包括单精度浮点数(float)、双精度浮点数(double)和长双精度浮点数(long double)。

    int a=4;//4为文字数值常量中的整型常量
    float b=4.4//4.4为单精度实型常量
    double c=1.4e10//1.4e5表示的值为1.4×10^5,双精度实型常量

    字符常量:指单个ASCII码字符,有256个,如’a’和’b’。

    符号常量:用标示符代表一个常量,使用之前必须定义。

    #define NUM 100//NUM为符号常量,100为整型常量
    enum Weekday{SUN, MON, TUES, WED, THU, FRI, SAT};//SUN,MON等均为符号常量

    2.常变量

    常变量指定义时必须显示初始化且值不可修改的变量。与其他变量一样被分配空间,是可以寻址的。注意,字符串常量是常变量的一种,名称为其本身,因为其存储在静态存储区的常量区,可寻址,不可修改。

    cout<<&”hello world”<<endl;//打印输出字符串常量”hello world”存储地址

    常变量在C/C++中由const关键字来定义,分为全局常变量和局部常变量。
    二者的区别在于:全局常变量存储在静态存储区的常量区,属于只读内存,不可修改。局部常变量存储在栈区,在高级语言语义层面上由编辑器做语法检查来保障其值不可修改,因不是放在只读内存中,可以获得局部常变量的地址,间接进行修改。有关C/C++程序内存分区可参见博客C/C++的四大内存分区
    参考如下代码:

    #include <iostream>
    using namespace std;
    const int con1=3;
    void showValue(const int& i)
    {
        cout<<i<<endl;
    }
    int main(int argc,char* argv[])
    {
        const int con2=4;
        int* ptr=NULL;
        ptr=const_cast<int*>(&con2);
        *ptr=5;
        showValue(con2);//1
        cout<<"con2:"<<con2<<endl;//2
        ptr= const_cast<int*>(&con1);
        *ptr=6;//3,运行时错误,写入冲突
    }

    程序1处输出5,表明局部常量con2的值已经被修改,2处输出为结果仍然为4,并不是说明常变量con2的值没有被修改,而是因为编译器在代码优化的过程中已经将con2替换成了文字常量4。程序3处,运行时出错,表明全局常变量存储在只读内存,无法间接改写。

    本文难免不足错误,欢迎同仁留言批评指正!

    参考文献

    [1]http://blog.chinaunix.net/uid-27710926-id-3359190.html.
    [2]百度百科.符号常量.
    [3]百度百科.字符常量.
    [4]百度百科.常量.
    [5]陈刚.C++高级进阶教程[M].武汉:武汉大学出版社,2008.

    版权声明:本文为博主原创文章,未经博主允许不得转载。

    ---转载或者使用代码,请注明原作者 This is bill
  • 相关阅读:
    05月27日总结
    05月18日总结
    05月24日总结
    05月21日总结
    05月25日总结
    05月20日总结
    GCC的使用
    wsl2使用
    常见Hash算法位数
    记一次网络漏洞扫描任务——Red Hat部署Nikto
  • 原文地址:https://www.cnblogs.com/ScytheWH/p/4622969.html
Copyright © 2020-2023  润新知