总结:这个跟计算机语言类别和编译器有关,本文是在linux环境下说明的.

分两种情况:

1. C语言:

2. C++语言:

/*! * \Description:

 * \author scictor <scictor@gmail.com>
 * \date 3
 */
#include <stdio.h>

;// 常量数据区,只读,指针修改导致程序Segmentation fault.const string myglobal("global"); //const_cast方式修改,不会引起崩溃.

int main(int argc, char *argv[])
{
    int *pg_i = (int *)&g_i;
    *pg_i = ;
    printf("%p %d %p %d\n", &g_i, g_i, &pg_i, *pg_i);  string* p=const_cast<string*>(&myglobal);  *p="local";//这里强行改变了值  printf("%s\n",myglobal.c_str());
 
;
    int *pa = (int *)&a;
    *pa = ;

    printf("%p %d %p %d\n", &a, a, pa, *pa);

    ;
    int *pi = (int *)(&i);
    *pi = ;
    printf("%p %d %p %d\n", &i, i ,pi, *pi);
    ;
}

/*
1.对于C语言:
先看结果:
$ gcc -g -Wall const.c -o xmain
$ ./xmain
0x7fff0146a9f8 3 0x7fff0146a9f8 3
0x7fff0146a9fc 32 0x7fff0146a9fc 32

解释:
const数据放在常量数据区(constant segment),应用程序结束后,由操作系统释放.
C标准规定,对于修改const变量属于未定义行为.

2.对于C++语言而言:
先看结果:
$ g++ -g -std=c++11 -Wall const.cpp -o xmain
$ ./xmain
0x7fffed0c89c8 10 0x7fffed0c89c8 3
0x7fffed0c89cc 32 0x7fffed0c89cc 32

解释:
根据C++标准,对于修改const变量,属于:未定义行为(指行为不可预测的计算机代码),这样一来此行为取决于各种编译器的具体实现(即不同编译器可能表现不同)。
没有加volatile修饰符,即此处编译器进行了优化,没有从内存中读,直接从符号表中取出的.
结果表现为:指针 pa 和 &a(a的地址)值却是一样的,但输出结果不同.
这就是C++中的常量折叠:指const变量(即常量)值放在编译器的符号表中,计算时编译器直接从表中取值,省去了访问内存的时间,从而达到了优化。
而在此基础上加上volatile修改符,即告诉编译器该变量属于易变的,不要对此句进行优化,每次计算时要去内存中取数.

总结:
修改const常量值受到以下因素影响:
实质原因:
C和C++语言标准规定不同(存储位置不同,不同限定关键字和读取规则不同):
在C语言中,用const定义的常量其实是值不能修改的变量,因此会给它分配存储空间,c++的编译器通常不为普通const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高.
*/

如何修改const常量值的更多相关文章

  1. Java 反射修改类的常量值、静态变量值、属性值

    前言 有的时候,我们需要修改一个变量的值,但变量也许存在于 Jar 包中或其他位置,导致我们不能从代码层面进行修改,于是我们就用到了下面的场景,通过反射来进行修改变量的值. 定义一个实体类 class ...

  2. C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值

    接收拦截+发送消息 对于处理所有消息.net 提供了wndproc进行重写 WndProc(ref Message m)protected override void WndProc(ref Mess ...

  3. WMsg参数常量值

    //WMsg参数常量值: //创建一个窗口 const int WM_CREATE = 0x01; //当一个窗口被破坏时发送 const int WM_DESTROY = 0x02; //移动一个窗 ...

  4. 【转】C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1)

    C# 重写WndProc 拦截 发送 系统消息 + windows消息常量值(1) #region 截获消息        /// 截获消息  处理XP不能关机问题        protected ...

  5. 【C++编程基础】(1)—— 函数原型声明、函数模板、引用、const 常引用、const 常量指针

    一.函数原型声明: 1.函数声明告诉编译器函数的名称,和如何调用函数(返回类型和参数):函数定义提供了函数的实际主体. 2.强制性的:在C++中,如果函数调用的位置在函数定义之前,则要求在函数调用之前 ...

  6. Java 常量值的数据类型

    Java 常量值(也叫字面量)和变量一样,也是有数据类型的. 经常有面试题考察你对 Java 常量值数据类型的理解,如下: float a = 3.3; 问你这一行代码是否正确?答案肯定是不正确.为什 ...

  7. 无法创建“Sunlight.Silverlight.Dcs.Web.PartsSupplier”类型的常量值。此上下文仅支持基元类型或枚举类型问题

    今天写代码遇到一个问题,            const string SCODE = "123";            var suppliers = PartsSuppli ...

  8. Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象

    Map生成器 map适配器如今能够使用各种不同的Generator,iterator和常量值的组合来填充Map初始化对象 package org.rui.collection2.map; /** * ...

  9. C++中如何修改const变量

      一.结论 声明:不同于C语言的const变量修改问题(可以通过指针间接修改const变量的值),这里只讨论C++ 里的const. C++ const 修饰符,表示常量,即如果以后保证不会修改则声 ...

随机推荐

  1. mysql数据库,安装 !创建!...详解!

    package cn.jiayou; /* 一.mysql? a.MySQL是Web世界中使用最广泛的数据库服务器. SQLite的特点? 1.是轻量级.可嵌入,但不能承受高并发访问,适合桌面和移动应 ...

  2. PLSQL 错误问题:Datebase character set (AL32UTF-8) and Client character set (ZHS16GBK) are different.

    (解决不了,网上用的是Orecal,我用的只是客户端.) 网上找到解决方法 打开注册表(ctr+R,输入regedit),根据报错提示找到注册表位置,但本机是win10 64位系统,根据以上路径找不到 ...

  3. Python——管道通信

    管道:双向通信 2个进程之间相互通信 from multiprocessing import Pipe,Process def func(conn1,conn2): conn2.close() whi ...

  4. 时频工具箱tftb

    安装:set path 常规里更新 一.信号产生函数: amexpo1s  单边指数幅值调制信号amexpo2s  双边指数幅值调制信号amgauss  高斯幅值调制信号amrect  矩形幅值调制信 ...

  5. Paint it really, really dark gray CodeForces - 717E

    Paint it really, really dark gray CodeForces - 717E 题意 有一棵树 每个结点是粉色或黑色 每经过一个结点 就改变他的颜色 从1开始遍历 打印出一条路 ...

  6. ceil以及double的精度问题

    Codeforces Round #518 (Div. 2) A CF一道水题,总过不去 后面看了一下数据发现是精度出问题了 1000000000000000000 1 1 1000000000000 ...

  7. mac上安装memcache

    1. 安装 brew (http://brew.sh/) /usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/H ...

  8. electron打包之真的恶心

    用electron-packager进行打包 这个模块的文档写的真的垃圾 1.先看看首页的参数介绍 就是说必选参数就是源码路径和app名字和--platform还有--arch咯,而且源码路径也没说是 ...

  9. Uva796 Critical Links

    用tarjan缩点 然后用dfn[u] < low[v]缩点并且保存起来 在sort一遍输出 #include<stdio.h> #include<string.h> # ...

  10. Codeforces 1051E. Vasya and Big Integers

    题意:给你N个点M条边,M-N<=20,有1e5个询问,询问两点的最短距离.保证没有自环和重边. 题解:连题目都在提示你这个20很有用,所以如果是颗树的话那任意两点的最短距离就是求一下lca搞一 ...