C++中恒量共分几种?符号常量共分几种
C++中常量共分几种?符号常量共分几种?
符号常量和常量是不是一个概念?
------解决方案--------------------
你举不出依据,你无凭无据,又凭什么把常量分为有名字与无名字呢?那么只有一个解释,你“自以为”而已。如果你是制定规则的人,例如C++标准委员会,这无可厚非,问题是你不是。
什么是常量?什么是cv-qualifier?这是很多人理解得一塌糊涂的东西,这些人当中当然也包括楼主你。关于常量典型的误解是把数学中常量的概念简单地套在C++上,以为不变的量就是常量,但C++中的常量其实根本就不是这个意思,C++中的常量指的就是字面量(C的常量内涵更少一点,编译期字面量才算常量,运行期字面量不是),下面贴出C++标准的规定,为了说明简单,我在这里仅举出C++03的条款,C++11多了几种字面量,但常量就是字面量的语义并没有改变,不影响理解:
C++语言只规定了这几种常量,只有这几种实体才称为常量,除此之外没有其它了,C++语言标准并没有把常量分为“有名字的”和“没名字的” ,更没有所谓的“符号常量”。
对于#define x 1,它实际上并非语言的一部分,与作为语言设施的常量更是连边都碰不着。
对于const int x,如果因为x有个const修饰符修饰就以为x是个常量,就大错特错了。首先基于上述语言标准的规定,x本就不属于常量;其次,按照标准的定义,x实际上是一个变量,C++标准是这样定义variable的:
3 Basic concepts
.......A variable is introduced by the declaration of an object. The variable’s name denotes the object.
就是说,对象的声明就能够产生变量,而与这个对象是否有cv-qualifier是没有任何关系的。
于是肯定有人有疑问了:那么那个const的意义究竟是啥??
const表达的是语义约束,而非物理约束,有上述疑问的人是把const理解成了物理约束。const所表达的意思其实是:你不能通过x这个名称(三条访问路径之一)修改x所代表的对象,而非把x所代表的对象定义为常量,也正因为如此,C++标准并没有禁止(通过其它路径)对const object的修改行为,而是把这种行为规定为未定义行为,作为未定义行为,编译器就爱咋做咋做了,都不违反标准(这才有了常量折叠这类巧妙的折衷)。
7.1.5.1 The cv-qualifiers
.......a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path.
符号常量和常量是不是一个概念?
------解决方案--------------------
你举不出依据,你无凭无据,又凭什么把常量分为有名字与无名字呢?那么只有一个解释,你“自以为”而已。如果你是制定规则的人,例如C++标准委员会,这无可厚非,问题是你不是。
什么是常量?什么是cv-qualifier?这是很多人理解得一塌糊涂的东西,这些人当中当然也包括楼主你。关于常量典型的误解是把数学中常量的概念简单地套在C++上,以为不变的量就是常量,但C++中的常量其实根本就不是这个意思,C++中的常量指的就是字面量(C的常量内涵更少一点,编译期字面量才算常量,运行期字面量不是),下面贴出C++标准的规定,为了说明简单,我在这里仅举出C++03的条款,C++11多了几种字面量,但常量就是字面量的语义并没有改变,不影响理解:
2.13 Literals [lex.literal]
1 There are several kinds of literals.21)
literal:
integer-literal
character-literal
floating-literal
string-literal
boolean-literal
..............
21) The term “literal” generally designates, in this International Standard, those tokens that are called “constants” in ISO C.
C++语言只规定了这几种常量,只有这几种实体才称为常量,除此之外没有其它了,C++语言标准并没有把常量分为“有名字的”和“没名字的” ,更没有所谓的“符号常量”。
对于#define x 1,它实际上并非语言的一部分,与作为语言设施的常量更是连边都碰不着。
对于const int x,如果因为x有个const修饰符修饰就以为x是个常量,就大错特错了。首先基于上述语言标准的规定,x本就不属于常量;其次,按照标准的定义,x实际上是一个变量,C++标准是这样定义variable的:
3 Basic concepts
.......A variable is introduced by the declaration of an object. The variable’s name denotes the object.
就是说,对象的声明就能够产生变量,而与这个对象是否有cv-qualifier是没有任何关系的。
于是肯定有人有疑问了:那么那个const的意义究竟是啥??
const表达的是语义约束,而非物理约束,有上述疑问的人是把const理解成了物理约束。const所表达的意思其实是:你不能通过x这个名称(三条访问路径之一)修改x所代表的对象,而非把x所代表的对象定义为常量,也正因为如此,C++标准并没有禁止(通过其它路径)对const object的修改行为,而是把这种行为规定为未定义行为,作为未定义行为,编译器就爱咋做咋做了,都不违反标准(这才有了常量折叠这类巧妙的折衷)。
7.1.5.1 The cv-qualifiers
.......a const-qualified access path cannot be used to modify an object even if the object referenced is a non-const object and can be modified through some other access path.