总结:这个跟计算机语言类别和编译器有关,本文是在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. LODOP直接用base64码输出图片

    Lodop中的ADD_PRINT_IMAGE,也可以直接输出base64码图片,不用加img标签,如果加了img标签,会被当做超文本对待,受浏览器引擎解析的影响. 什么时候使用base64码直接输出比 ...

  2. Spring Boot2.0自定义配置文件使用

    声明: spring boot 1.5 以后,ConfigurationProperties取消locations属性,因此采用PropertySource注解配合使用 根据Spring Boot2. ...

  3. P1091 合唱队形 最长上升子序列

    思路:最长上升子序列 正着做一遍 倒着做一遍 然后 取最大值 #include<bits/stdc++.h> using namespace std; const int maxn=105 ...

  4. Codeforces1036F Relatively Prime Powers 【容斥原理】

    题目分析: 这种题目标题写莫比乌斯反演会不会显得太恐怖了,那就容斥算了. gcd不为1的肯定可以开根.所以把根式结果算出来就行了. 辣鸡题目卡我精度. 代码: #include<bits/std ...

  5. 「Splay」普通平衡树模板

    口诀: $rotate$:先上再下,最后自己 $splay$:祖父未到旋两次,三点一线旋父亲,三点折线旋自己. $delete$:没有儿子就删光.单个儿子删自己.两个儿子找前驱. 易错点: $rota ...

  6. Matplotlib学习---用wordcloud画词云(Word Cloud)

    画词云首先需要安装wordcloud(生成词云)和jieba(中文分词). 先来说说wordcloud的安装吧,真是一波三折.首先用pip install wordcloud出现错误,说需要安装Vis ...

  7. JS 实现DIV 滚动至顶部后固定

    JS 实现DIV 滚动至顶部后固定 <!DOCTYPE HTML> <html> <head> <meta charset="UTF-8" ...

  8. Shell 字符截取命令 awk

    awk命令# awk '条件1{动作1} 条件2{动作2}….' 文件名一般使用关系表达式作为条件动作:1.格式化输出 2.流程控制语句 处理cut命令无法截取空格的列 例子:截取出磁盘使用率 df ...

  9. NOIP2018保卫王国

    题目大意:给一颗有点权的树,每次规定两个点选还是不选,求这棵树的最小权点覆盖. 题解 ZZ码农题. 要用动态dp做,这题就是板子,然鹅并不会,留坑代填. 因为没有修改,所以可以静态倍增. 我们先做一遍 ...

  10. 【算法】php计算数字k在一段数字范围出现的次数

    计算数字k在0到n中的出现的次数,k可能是[0~9]内的一个值. 例如数字n=25,k=1,在1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 ...