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

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

发布网友 发布时间:2022-05-07 09:41

我来回答

2个回答

热心网友 时间:2023-10-24 10:00

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

热心网友 时间:2023-10-24 10:00

因为这个12345是要存放在你运行时刻的内存中的,程序在你引用这个常量时就从那个位置取数来用,一般认为是const类型的,即只读不可写;当然你可以操作它,用指针修改它的值,但是修改后你程序中用到12345这个值的地方再取到的数据有可能就是你修改过的数据而不是12345了。这种操作一般程序中不会有,所以可以修改成非const的。

热心网友 时间:2023-10-24 10:00

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

热心网友 时间:2023-10-24 10:00

因为这个12345是要存放在你运行时刻的内存中的,程序在你引用这个常量时就从那个位置取数来用,一般认为是const类型的,即只读不可写;当然你可以操作它,用指针修改它的值,但是修改后你程序中用到12345这个值的地方再取到的数据有可能就是你修改过的数据而不是12345了。这种操作一般程序中不会有,所以可以修改成非const的。

热心网友 时间:2023-10-24 10:00

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

热心网友 时间:2023-10-24 10:00

因为这个12345是要存放在你运行时刻的内存中的,程序在你引用这个常量时就从那个位置取数来用,一般认为是const类型的,即只读不可写;当然你可以操作它,用指针修改它的值,但是修改后你程序中用到12345这个值的地方再取到的数据有可能就是你修改过的数据而不是12345了。这种操作一般程序中不会有,所以可以修改成非const的。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
你家的水龙头起泡器该换了 如何打开水龙头起泡器 网上卖门锁,安装如何解决 广告装潢需要哪些设备 广告制作需要哪些材料 开锦旗招牌广告制做店须要什么 广告店需要哪些耗材 长安之星发动机水泵要坏之前声音怎么判断 家有孕妇咋调理:280天贴心呵护生健康宝贝图书信息 哪些是适合孕妇看的书 八进制字面值常量012的数据类型是什么? c++指定一个字符串字面值的类型为char16_t怎么写 请问C++字面值的一个问题,书上说尽管整形字面值可以存储在带符号数据类型中,但严格来说,十进制字面 什么是常量?常量的分类?字面值常量表现形式有哪些? 请问C++中 10e-2字面值默认是什么数据类型呢 字符字面值‘2’是char型?为何不是int型呢?C++ Primer里 C++中什么是字符串,什么是字符字面值 C# 字面值 谁可以解释一下C#中的字面值是什么意思?与之对应的还有其他什么类型的值。举例说明。谢谢! java中,字面值是什么意思 C#字面值是什么意思 字符串字面值的类型 青桔电动车包月每天最多优惠20次是什么意思? 青桔包月多少钱一个月? 全体股权转让协议的要点有哪些 请问广州市70岁以上老人补贴怎么进行网上年审,穗好办app的那个程序进去_百度问一问 广州市75岁老人可以补领70—75岁的高龄倾斜补贴吗? 70岁老人补贴? 听说深圳70岁以上的老年人每天有15元的生活补贴是真的吗? 广州市哪一年开始执行70岁以上老人家补贴政策 请问湛江吴川城乡老人超过67岁的每人每月多少钱 c++中说明字面值52L,100u是什么意思 请问C++中字面值的一个问题,书上说尽管整形字面值可以存储在带符号数据类型中,但严格来说,十进制字 作为char类型的字面值的有 大神来看看我这新配的电脑i510400F,GTx 10606G 价格4750电脑城提的价格怎么样? 铁道12306网上订票什么时间开始 剥好的柚子放保鲜盒里盖上盖子可以放多久? 手机充电器能通用吗? 充电器可以通用吗 充电器能通用吗? Excel 怎么按用宏实现按比例缩放图片 Excel中利用宏使在一个单元格输入内容后自动插入图片,关键是怎么把插入的图片缩小点 excel中应用宏调用图片 Excel里的图片怎么用宏自动调整到一定的大小 用EXCEL 宏 做一个自动加载图片的 打开word文档时,word上面的“文件、编辑……”一栏看不见了 ?我也打开了自定义里的菜单栏和命令栏不好使 请问哪里有大量的网络资源共享? 可以用资源共享的软件有那些 三角函数的公式整理 在天花板上打孔用电钻还是电锤 楼顶有铁板怎么打孔?