【问题标题】:Is an address sometimes referred to as an 'l-value'地址是否有时被称为“左值”
【发布时间】:2021-07-04 16:45:27
【问题描述】:

在我的编程语言课上准备考试。在教科书中看到了这段摘录。

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

我在大学以外的一些年里一直在自己的时间学习 C++,至少价值类别的主题足够复杂,以至于我不得不复习很多次才能理解它我的头,仍然需要打开 cppreference 页面来查看更新的类别。至少这似乎是一个巨大的过度简化。这只是错误的吗?还是我从未遇到过这种使用左值的方法?

编辑: 这本教科书是关于一般编程语言的,而不是专门针对 C 或 C++ 的。对造成的混乱表示歉意。

【问题讨论】:

  • 没有。当您有一个指针持有一个在赋值运算符左侧被取消引用的可变地址时,它是一个左值。例如。 int a = 5, *b = &a; "...the address is what is required when the name of a variable appears in the left side of an assignment." 措辞指定= 左侧的标签必须表示有效的可变地址,无论它是普通变量(即标签)还是指针。
  • 一个左值一个地址,而不是一个地址
  • 教科书是在讨论 C++ 还是一般的编程? “左值”有多种可能的含义(C++ 使用“左值”,而不是“左值”)。
  • @KeithThompson 将帖子编辑得更清楚,感谢您对“l-value”与“lvalue”的澄清!

标签: c++ lvalue value-categories


【解决方案1】:

“左值”或“左值”的含义有着悠久而复杂的历史。在该术语的一些较早的定义中,这句话是正确的——但它与 C++ 标准定义它的方式不一致。如果你的教科书是在讨论 C++,那这段话是有问题的。如果是泛泛地讨论编程,应该没问题。

在 C++(以及 C)中,左值不是值。它是一种表达式,即可以出现在 C++ 源代码中的构造。它是表达式本身,而不是对其求值的结果。

C++11标准中的定义是:

一个左值(历史上所谓的,因为左值可能出现在 赋值表达式的左侧)指定一个函数 或一个对象。

该定义是在对表达式进行分类的上下文中。

当术语“左值”和“右值”最初被发明时,它们指的是可以出现在赋值左侧 ('l') 或右侧 ('r') 的事物。在原始含义中,像x 这样的表达式可以“评估其左值”,这意味着它标识名为x 的对象,或“评估其右值”,这意味着它检索当前存储在x 中的值. C 和 C++ 标准改变了术语的含义,因此“左值”是一个表达式,而不是对其求值的结果。

(话虽如此,C++11 标准中讨论所有这些的部分可能有点模糊,并且有一些措辞可能暗示左值可能是对表达式求值的结果。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-12-25
    • 2016-05-24
    • 2012-11-28
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2011-10-07
    • 1970-01-01
    相关资源
    最近更新 更多