问题描述
在我的编程语言课上为考试而学习。在教科书中看到了这段摘录。
“变量的地址有时称为它的左值,因为当变量的名称出现在赋值的左侧时,该地址是必需的。”
在大学以外的几年里,我一直在用自己的时间学习 C++,至少值类别的主题足够复杂,我不得不多次复习它才能稍微深入了解我的头,仍然需要调出 cppreference 页面来查看较新的类别。至少,这似乎是一个巨大的过度简化。这真的是假的吗?还是我从未遇到过这种 l 值的使用?
编辑: 教科书一般是关于编程语言的,而不是专门针对 C 或 C++ 的。对造成的混乱深表歉意。
解决方法
“lvalue”或“l-value”的含义有着悠久而复杂的历史。在该术语的一些较旧的定义中,这句话是正确的——但它与 C++ 标准定义它的方式不一致。如果你的教科书讨论的是 C++,那段话是有问题的。如果是一般性地讨论编程,那可能没问题。
在 C++(以及 C)中,左值不是值。它是一种表达式,即可以出现在 C++ 源代码中的构造。它是表达式本身,而不是计算它的结果。
C++11 标准中的定义是:
一个左值(历史上这样称呼,因为左值可能出现在 赋值表达式的左侧)指定一个函数 或一个对象。
该定义是在对表达式进行分类的上下文中。
当术语“lvalue”和“rvalue”最初被发明时,它们指的是可以出现在赋值左侧 ('l') 或右侧 ('r') 的东西。在原始含义中,像 x
这样的表达式可以“为其左值求值”,这意味着它标识名为 x
的对象,或“为其右值求值”,这意味着它检索当前存储的值在x
。 C 和 C++ 标准已经改变了术语的含义,因此“左值”是一个表达式,而不是计算它的结果。
(话虽如此,C++11 标准中讨论所有这些的部分可能有点含糊,有些措辞可能暗示左值可能是对表达式求值的结果。)