c++ - 地址是否有时被称为“左值”
问题描述
在我的编程语言课上学习考试。在教科书上看到了这段摘录。
“变量的地址有时称为它的左值,因为当变量的名称出现在赋值的左侧时,地址是必需的。”
在大学以外的几年里,我一直在自己的时间学习 C++,至少价值类别的主题足够复杂,以至于我不得不多次复习它才能在我的脑海中有所了解,并且仍然需要打开 cppreference 页面来查看较新的类别。至少这似乎是一个巨大的过度简化。这只是错误的吗?还是我从未遇到过这种对 l 值的使用?
编辑:教科书一般是关于编程语言的,而不是具体的 C 或 C++。为混乱道歉。
解决方案
“左值”或“左值”的含义有着悠久而复杂的历史。在该术语的一些较早的定义中,这句话是正确的——但它与 C++ 标准定义它的方式不一致。如果你的教科书是在讨论 C++,那这段话是有问题的。如果它是在讨论一般的编程,那可能没问题。
在 C++(以及 C)中,左值不是值。它是一种表达式,即可以出现在 C++ 源代码中的构造。它是表达式本身,而不是评估它的结果。
C++11标准中的定义是:
左值(历史上称为左值,因为左值可能出现在赋值表达式的左侧)指定函数或对象。
该定义是在对表达式进行分类的上下文中。
最初发明术语“左值”和“右值”时,它们指的是可以出现在赋值左侧('l')或右侧('r')的事物。在最初的含义中,一个表达式 likex
可以“针对其左值求值”,这意味着它标识了名为 的对象x
,或者“针对它的右值求值”,这意味着它检索当前存储在 . 中的值x
。C 和 C++ 标准改变了术语的含义,因此“左值”是一个表达式,而不是评估它的结果。
(话虽如此,C++11 标准中讨论所有这些的部分可能有点模糊,并且有一些措辞可能暗示左值可能是评估表达式的结果。)
推荐阅读
- c - C pthread 包括头文件并与 -nolibc 链接
- java - 从 url 下载 .svg 图片
- python - Python中数据框中的计算
- laravel - 在 Laravel 中仅加载某些语言文件(数组)
- javascript - (VUE.js)在组件外部调用时事件不起作用
- firebase - 如何在 Xamarin 表单中保存 Firebase 实时数据库中的 URL?
- java - MainMenu.onCreateOptionsMenu 崩溃
- python - 有没有办法获得 Cx_Oracle.cursor.execute() 的语句执行的 ddl 语句输出?
- javascript - DOMContentLoaded 没有在浏览器扩展 Firefox 中触发
- java - 使用流按多个属性分组和排序:Java 8