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

如: 12345 是const int还是int?

345.5 是const double 还是double?

某天看了一篇文章,文章下面的评论提到这个问题!本人很是困惑!求权威解答!

我是这样想的: 因为C语言的const和C++里的const的语义不一样,所以呢为了保持向后兼容,就将基本类型字面值定义为非const.....

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
温馨提示:内容为网友见解,仅供参考
第1个回答  2013-03-22
因为这个12345是要存放在你运行时刻的内存中的,程序在你引用这个常量时就从那个位置取数来用,一般认为是const类型的,即只读不可写;当然你可以操作它,用指针修改它的值,但是修改后你程序中用到12345这个值的地方再取到的数据有可能就是你修改过的数据而不是12345了。这种操作一般程序中不会有,所以可以修改成非const的。

C++里的基础类型字面值都底是const的还是非const得?请看看问题提...
在 C++ 中 "hello" 是 char const [6] 类型(相应地,每个字符元素的类型是 char const);转换为指针使用的时候是 char const*、在特殊情况下也可以是 char*。之所以在 C 中字符串字面量不是 const 数组(也就是说每个字符元素的类型不是 char const),是因为 C 要照顾或者考虑到标准制定之...

请教一个有关C++字面常量的问题
字面常量,如果你没有用指针指向它的话,常量就是一个临时的数值,是没法获得它的地址的。

C++中字面值常量是什么?
常量(constant)可以理解为所谓的字面值,常量和用const修饰的变量并不是一个概念。比如有语句如下:view plaincopy int a = 1234;那么语句中的int就是数据类型,a是变量,1234是字面值。int的字面值也就是可以用来初始化int类型变量的东西(不要说用其他变量也可以初始化哦!)。同样,char的字面值当...

C++基础知识1 -- class
聚合类和字面值常量类是C++中的特殊类别,它们遵循特定的规则,如聚合类的初始化方式,以及constexpr构造函数的空函数体和constexpr关键字的使用。

C++关键字 constexpr
允许constexpr函数返回一个非常量的值。请注意:constexpr函数不需要返回常量表达式。与其他函数不同,内联函数和constexpr函数可以在程序中多次定义。因此,constexpr函数用于生成constexpr对象以及constexpr函数的形参或返回类型。constexpr constructors:虽然构造函数不能是const成员函数,但字面值类类型中的...

c++初始化引用问题
对于const引用可以用字面常量去初始化的啦,而对非const引用就不行了啦 int &&a=100;没有这样的写的,是不对的啦,&&在c++中是与逻辑符号。

Const 和 Constexpr
在C++中,字面值常量是一类特殊常量,无名,仅以其值称谓,包括整型、浮点型、字符串等。const和constexpr在定义常量上有所不同。const用于指定常量,而constexpr则用于指定常量表达式,使用constexpr可优化并提升代码可读性和执行效率。在C++14中,constexpr的使用范围显著扩大,除基本语法外,还允许包含if...

C++中,char *是不是一旦指向字符串就变成const char *了?
不是,变量声明为char*那么就永远是char*型。如果令一个char*型变量指向字符串字面值,编译不会报错(可能会出现警告),但接下来如果试图修改字符串字面值的内容将会导致程序崩溃。所以,任何时候指向字符串字面值的指针都应该声明为const char*型。

C++ 里 const int inf=~0U>>1 这句话什么意思
~换位取反 0U或u将整形字面值强制转换为unsigned类型,0默认是int类型。>>逻辑右移 呵呵,以下不用我说,你也能看明白了。

C++中为什么临时对象的引用一定要加const;就像: const string& s...
2、另外,即使说,我所有代码为了易读,绝对不会出现字面值这东西,还有个问题。如果你写了个函数为了保护参数加了const,但函数里面调用了另一个参数没const的函数,那么这里估计就要出错,const实参不能传递给非const形参。虽然你能保证自己的代码不冲突,但不能保证别人的代码,尤其是合作的时候每人写一...

相似回答
大家正在搜