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的。