有时称为“l 值”的地址

问题描述

在我的编程语言课上为考试而学习。在教科书中看到了这段摘录。

“变量的地址有时称为它的左值,因为当变量的名称出现在赋值的左侧时,该地址是必需的。”

在大学以外的几年里,我一直在用自己的时间学习 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 标准中讨论所有这些的部分可能有点含糊,有些措辞可能暗示左值可能是对表达式求值的结果。)

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...