在artile的最后:http://www.learncpp.com/cpp-tutorial/45-enumerated-types/
它提到了以下句子:
最后,与常量变量一样,枚举类型显示在调试器中,使它们在这方面比#defined值更有用。
“常量变量”是否是正确的术语?常量不是与变量不同吗?
感谢。
答案 0 :(得分:8)
它是变量,因为它是一个可寻址对象,而不是文字常量,它是不可寻址的。
这可能是矛盾的,但语言标准通常使用术语变量来指代可寻址对象,并const
指定只读可寻址对象。
答案 1 :(得分:5)
C ++中的常量是一种特殊的变量。我理解这对于常识来说可能听起来很矛盾,但这就是它在C ++中的表现。
int var1 = 1;
int const var2 = 2;
它们之间的区别仅在于const
关键字,它告诉编译器创建var2
后的值不得更改:
var1 = 2; // fine
var2 = 1; // compilation error!
此简单规则还会导致对const
变量实施进一步的约束,例如您无法创建对const
变量的非const
引用(否则您仍然可以通过该引用更改其值)。由于同样的原因,您不得将var2
传递给具有签名f(int& i)
的函数。但是,您可以创建const
对它们的引用,使用它们的值等,就像使用任何“普通”变量一样。总的来说,它们就像任何其他变量一样。
答案 2 :(得分:3)
是的,这有点矛盾。变量是根据定义而变化的东西,常量是根据定义不变的东西。
除此之外,在C ++(和其他语言)中,人们仍称它们为常量变量,因为我们基本上会想到任何带有名称作为变量的值。
尽管只是说“不变”。
答案 3 :(得分:2)
常数是变量。在C ++(和大多数语言)中,将变量定义为常量只是告诉编译器不允许更改变量。
答案 4 :(得分:1)
从表面上讲,这是一个明显的矛盾,并且可能是出于历史原因(“变量”用于指代与名称和类型相关联的存储位置)。
但是,我可以尝试证明这个词的合理性: 在编译时,它是一个变量 - 在优化之前,它具有变量具有的所有属性 - 占用内存,具有位置等等 - 并且处理方式大致相同。 (相反,您提供的值如43423L,3.141或文字“somestring”不是变量。) 在运行时,它不能再被更改,并被视为常量。它是一种“一次写入变量”,您可以在源代码中设置它。
答案 5 :(得分:0)
很多人都很困惑。在K& R C中,可以改变字符串文字。因此,文字作为常量意味着不可变是错误的。在ISO C和C ++中,对于某些T,T const类型的变量也可以使用强制转换进行更改。所以,常数并不意味着不可变。正如@foo在上面指出的那样,由于优化,常量通常不具有变量的属性,实际上语义通常指定它。另外不要忘记在C和C ++中有常量表达式有时称为编译时常量,用于数组边界,例如,一种永远不会与变量混淆的常量,同意吗?
所以这是一个定义:常量是名称与值的绑定。使用此定义,1
是常量,因为它是文字名称,绑定是隐式的。在这里
enum {x};
void f();
有两个常量,即x
和f
:这些是符号名称的绑定(在这种情况下,两个标识符,在C ++ operator+
中也是名称而不是标识符)
现在,我将告诉你另一个让你感到惊讶的常数!
int y = 1;
是的,y
也是一个常数!它是名称y
与地址的绑定。
[如果在堆栈上,则改为与帧基的偏移量]
所以实际上,如果你认真考虑它,抽象语法中的所有内容都是常量:)