问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

C++里的基础类型字面值都底是const的还是非const得?请看看问题提...

发布网友 发布时间:2024-09-25 15:00

我来回答

2个回答

热心网友 时间:2024-10-20 12:16

12345和345.5这样的都是字面常量。字面常量只能引用,不能修改,所以它们一般会被保存在符号表里而不是一般的数据区中。它们无法被取址,更不可能允许被修改。所以讨论它们是const还是非const没有意义。
例外的情况是字符串字面常量(形如“abc”这样的),它们被存放在“文字常量区”,可以取得它们的首地址。在C语言和C++中,它们的const性有所不同,一下是引用自某帖子的原话:

区别点:
在类型限定上的不同
C 中的字符串字面量 "hello" 是数组类型 char[6](相应地,每个字符元素是无 const 限定的 char 型);作为右值使用的时候转换为指针类型 char*。
在 C++ 中 "hello" 是 char const [6] 类型(相应地,每个字符元素的类型是 char const);转换为指针使用的时候是 char const*、在特殊情况下也可以是 char*。
之所以在 C 中字符串字面量不是 const 数组(也就是说每个字符元素的类型不是 char const),是因为 C
要照顾或者考虑到标准制定之前已经存在的大量代码——那时的 C 语言还没有 const 关键字,如果硬性规定为 const 数组,则 char* p
= "hello"; 这样的初始化或者 char* q; q = "hello"; 这样的赋值就是非法的了(因为右边的类型 char
const* 不能默认转换为左边的类型 char* )。
同样,为了使上述代码能顺利通过编译过程,C++ 采取了另外一种策略:它规定了字符串字面量的类型是 const
数组,同时又特别规定了字符串字面量也可以有限制地转换为指向非常量的指针(对于 "hello" 来说就是
char*),从而解决了上述代码中存在的问题。不过,转换到 char* 主要是为了兼容以前的代码,这种转换被 C++
标准标记为“Deprecated”,所以在写程序的时候不应该依赖于这种转换。
C++ 中的字符串字面量是常量,而在 C 中不是常量。
正是由于标准在类型上的不同规定造成了在 C 和 C++ 中字符串字面量常量性质上的差别。
在 C 中,除了 string literals 和 compound literals(C99 only)之外,其它的 literals
都是常量;而在 C++ 中,包括 string literals 在内的所有 literals 都是常量(注意:C++ 中不存在
compound literals。)
在现实中,经常可以看到用“字符串常量”来指代“字符串字面量”的情况,其实对于 C 来说这是不正确的,因为在 C 中字符串字面量不属于常量;而对于 C++ 来说,“字符串常量”和“字符串字面量”实际上是一回事,只不过看问题的角度不同罢了。
顺便提一下:C++ 中的常量可以有对象常量(如字符串字面量、const 限定的对象)和非对象常量之分,而 C 中的常量不包含对象,它们最明显的特征就是不能进行取址运算,因此常量只能作为非左值(即右值)来使用。
语法及语义上的区别
C 中的字符串字面量不是常量,它的每个字符元素也不是常量,所以字符元素的不可变性仅仅表现在语义层面,但在语法和约束条件上没有要求。而 C++
中字符串字面量是常量,每个字符元素也是常量,因此在语义和约束条件两方面都要求不能改变其中的每个字符元素;另外,出于兼容性考虑 C++ 还存在着特殊情况下的向非 const 指针的转换。

原帖地址:http冒号//bbs点chinaunix点net/thread-936821-1-1点html

热心网友 时间:2024-10-20 12:12

因为这个12345是要存放在你运行时刻的内存中的,程序在你引用这个常量时就从那个位置取数来用,一般认为是const类型的,即只读不可写;当然你可以操作它,用指针修改它的值,但是修改后你程序中用到12345这个值的地方再取到的数据有可能就是你修改过的数据而不是12345了。这种操作一般程序中不会有,所以可以修改成非const的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
NBA下赛季常规赛MVP和总决赛MVP会是谁 吴前当选CBA常规赛MVP,他是实至名归吗? 如何申请安电表 如何申请独立电表 用电量大可以增加电表吗 出租他人铺面,原先房东已经安装过电表,因为用电量大,我想自己装电表可以... 梦见有个老人送佛画给我、让我在家供佛 ...分之一米还剩多少米如果截去四分之一还剩几分之几还剩多少米?_百度... 一根竹竿长四米,截去它的四分之三后,这根竹竿还剩全长的几分之几? ...这根绳子的几分之几后还剩下他的3/1,用去了( )m,还剩下( )_百度知... 5/8+1/2等于多少写分数 一个八分之五减去五分之一等于多少? 1/5×5/8等于多少用分数? 5/8+1/5等于多少? 5/8÷一个分数所得的商一定大于5/8,对吗? 生存,下降,黑暗的反义词 有一部小说讲的是主角高考落榜,失恋,然后跳崖,意外得到星际秩序者的结... 个人养猪前景怎么样 农村养猪前景如何 梦游江湖手游版(梦游江湖下载安装) 梦幻西游,龙宫满天星好还是天山雪魔杖哪个好 我是2011年10月买的广本雅阁,现在加速反应很迟钝,还发抖。尾气很重,请... 2004年的广本雅阁2.4的排量,一共跑了8万公里现在可以卖多少钱?_百度知 ... 请问,2001年5月广本雅阁是国几的车啊 2012年7月的广本雅阁可以转京牌吗 箜这个字拼音怎么拼 "箜"这个字怎么读 ?什么意思 ? 2022年社保超期怎么交? 电工胶带什么牌子好? 流量秘书的基本简介 ?抖音月付怎么用微信支付还? 怎么还抖音月付钱? 怎么在抖音使用微信支付还款? 西宁市爱国卫生管理条例第五章 法律责任 西宁市爱国卫生管理条例第一章 总则 ...从左边数起,第一个“3”表示3个几,第二个“3”表? 在自然数从小到大顺序排成一个多位数则从左起第800个数字是多少?有过程... 全自动机械男表十大品牌 质量好的国产手表品牌有哪些? 男表什么牌子好用?男表十大品牌排行 男士的商务手表有哪些品牌值得推荐? 男表哪个牌子的比较好 谈恋爱好累是怎么回事? 名表品牌排行榜前十名男表 瑞士男表有哪些品牌 性价比高的男士商务手表有哪些? 手表品牌排名大全男表 性价比高的腕表品牌有哪些? 千元以下的男表有哪些品牌比较受欢迎? 哪个品牌的手表在国内质量好