我们已经知道了字面值常量的值是不可更改的,所以称之为常量。变量是内存中的一块存储空间,我们可以读写里面的内容。但有时候我们也需要一种机制能够阻止随意的修改一个变量的值,这时候我们就要用到const限定符(const-qualifier)。在定义或者声明一个变量的时候,const限定符可以放在我们前面讲过的类型说明符前面或者后面表示该变量的值不可被更改。要注意的是,如果变量定义或者声明的时候有const限定符,那么一定要进行初始化。因为const变量不可以后来被赋值。对基本数据类型来说,这也是初始化和赋值的一个细微差别:可以初始化一个const变量,但不可以赋值。例如,
int nonconst_var = 3;
nonconst_var = 4;
const int const_var1 = 5;
int const const_var2 = 6;
const_var1 = 7; //错误:不可赋值
const_var2 = 8; //错误:不可赋值
const int const_var3; //错误:必须初始化
小知识:const限定符可以放在普通的类型说明符前面,例如const unsigned long,const long long等,也可以放在普通的类型说明符后面,例如unsigned const,long double const,等等。无论你喜欢放在前面还是放在后面,最好在同一个程序中保持位置一致。很多人提倡放将const限定符放在类型说明符后面,但C++的创造者Bjarne Strostrup博士自己更喜欢放在前面。
const限定符在语法上也是类型说明符的一种,但是他不可单独使用,必须和其他的类型说明符搭配使用而表明不可改变(constant)的性质。因为const限定符也是类型说明符,所以const变量和非const变量在C++中并不是同一种类型,虽然他们之间还是有着千丝万缕的联系,我们以后会详细讲述。你现在要记住的便是int和const int并不是同一种类型。
我们已经知道,const变量不能被修改。C++还提供了一种更为"严格’'的constexpr说明符(constexpr-specifier),在变量被声明或者定义的时候,如果类型说明符前面或者后面用了constexpr说明符,则表明该变量是一个const变量同时该变量必须被初始化。你也许说,这个const不是一样么?constexpr更加严格,用来初始化该变量的表达式必须是一个常数表达式。也就是说constexpr变量是一个由常数表达式初始化的const变量。关于常数表达式,我们以后还会详细谈起,对于基本数据类型来说,常数表达式是由字面值常量,constexpr限制的变量,和由常数表达式初始化过的const变量组成的表达式。换句话说,常数表达式的值在编译期间就可以确定。例如,
int nonconst_var = 100;
const int const_var1 = 2;
const int const_var2 = nonconst_var;
constexpr int constexpr_var1 = 3 + const_var1 * 4; //成立
constexpr int constexpr_var2 = 3 + nonconst_var * 4; //错误
constexpr int constexpr_var3 = 3 + const_var2 * 4; //错误
constexpr的变量的值必须是编译器在编译的时候就可以确定的。上例中因为nonconst_var的值在语法上来讲,运行期间可能被更改,所以编译期间无法确定,不属于常数表达式。因为const_var2是由非常数表达式来初始化的,所以const_var2也不是常数表达式。但const_var2本身的声明,定义及初始化是合法的。constexpr比const更严格,用来初始化constexpr_var2和constexpr_var3的也都不是常数表达式,所以他们的定义都是错误的。
小知识:constexpr和const一样,都可以放在类型说明符的前面或者后面。但和const不一样,绝大多数人的习惯都会将constexpr放在类型说明符前面。所以除非你知道你在做什么,请将constexpr放在类型说明符前面。还有一点和const不一样的是,constexpr并不是类型说明符,但是constexpr定义的变量都是const类型的变量。
作者:heartszhang
来源:CSDN
原文:https://blog.csdn.net/heartszhang/article/details/7248154
版权声明:本文为博主原创文章,转载请附上博文链接!
我们已经知道了字面值常量的值是不可更改的,所以称之为常量。变量是内存中的一块存储空间,我们可以读写里面的内容。但有时候我们也需要一种机制能够阻止随意的修改一个变量的值,这时候我们就要用到const限定符(const-qualifier)。在定义或者声明一个变量的时候,const限定符可以放在我们前面讲过的类型说明符前面或者后面表示该变量的值不可被更改。要注意的是,如果变量定义或者声明的时候有con...
字面值类型
常量表达式的值需要在编译时就得到计算,因此对声明constexpr时用到的类型必须有所限制。因为这些类型一般比较简单,值也显而易见、容易得到,就把它们称为“字面值类型”(literal type)。
算术类型、引用和指针都属于字面值类型。某些类也是字面值类型,它们可能含有constexpr函数成员。自定义类Sales_item、IO库、string类型不属于字面值类型。
尽管指针...
C语言声明变量练习题
1.一个无符号长整数常量(使用const关键字)与标识符ulconst和值127,745。
const unsigned long ulconst = 127745LU; // or 127745UL,
127745lu, 127745ul
const unsigned long ulconst = 127745;
2.带有标识符ULCONST和值的无符号长整数常量(使用宏)127,745。
#define ULCONST 127745LU // or 127745UL, 12
`int i ;`
等同于`signed int i;`
signed为有符号型。unsigned为无符号型。那么问题来了,什么是符号?举例说 正10(10)和负10(-10)前面的正负号就是符号。
unsigned是缺少一个符号位,等于多获得一位表示值的位置,其在正数所能表示的最大值为signed的两倍(int默认4字
非指针const:
① const TYPE 常量标志符=常量表达式;
② TYPE const 常量标志符=常量表达式; 常量表达式可以是常数,或者不带函数调用的简单表达式,因为系统在编译阶段对标识常量求值,所以不能调用函数。因为常量在定义后就不可以修改了,所以必须在定义的时候初始化。
③ 对于一个非指针的类型TYPE无论怎么写,都是一个含义,即常量标识符的值不可变。
指针const
<br />《C++ Primer Plus(第五版)中文版》P277:<br />在 C++ (但不是在 C 语言)中,const 对默认存储类型稍有影响。默认情况下,全局变量的链接性为外部的,但 const 全局变量的链接性为内部的。也就是说,在 C++ 看来,全局 const 定义就像使用了 static 说明符一样。 <br /> <br />测试代码(VS2010 /W4 /WX):<br />// const_var_def.cpp
extern const int const_var