c - c和c ++中左值的含义是否不同?
问题描述
有人告诉我,数组名称是 C 中不可修改的左值,但它仍然令人困惑。
有人说数组名不能放在公式的左边,因为它被转换为非左值的指针。
我的问题在这里:
- 是数组名左值吗?
- c 和 c++ 中的 l-value 的含义有什么区别吗?
解决方案
- 是数组名左值吗?
是的,在 C 和 C++ 中。
- c 和 c++ 中的 l-value 的含义有什么区别吗?
是的,但意义不大。以下是 C11 第 6.3.2.1/1 段中的定义:
左值是一个表达式(对象类型不是 void),它可能指定一个对象
C 还包括一个对此进行扩展的脚注(#64),其中包括:
名称“左值”最初来自赋值表达式
E1 = E2
,其中左操作数E1
必须是(可修改的)左值。将其视为表示对象“定位器值”可能更好。[...]左值的一个明显例子是对象的标识符。
以下是 C++14 第 3.10/1 段的定义:
左值(历史上称为左值,因为左值可能出现在赋值表达式的左侧)指定函数或对象。
如果你仔细阅读,你会注意到在 C 中,左值只是潜在地指定一个对象,而在 C++ 中,没有为未实现的潜力留下空间——左值确实指定了一个对象或函数。然后您还会注意到 C++ 在其左值中包含函数指示符,而 C 没有。在实践中,这些区别更多的是技术性的,而不是深刻的意义。而且它们都不影响您的问题(1)的答案。
您还会注意到,这两个定义都不是根据左值的使用方式或位置来编写的。这是从定义和其他规范得出的;这不是一个决定性的特征。
在 C 和 C++ 中,数组的标识符表示一个对象——数组——因此它是一个左值。这样的左值实际上是否可以作为赋值表达式中的左操作数出现是一个完全独立的问题。
推荐阅读
- amazon-web-services - 为 AWS Fargate 配置应用程序端口
- javascript - clone() 生成动态行但具有相同的 id 和 name
- android-databinding - Data Binding 多模块项目中没有这样的方法和字段错误
- javascript - laravel中codeigniter row_array的等价物是什么?
- python - 在与 python 的电报机器人对话期间触发消息,在超时之前
- javascript - 输入后按下提交按钮时的未定义值
- html - 无法选中一个复选框,在我仅选中表中的一个复选框后选中所有复选框
- javascript - Firebase Cloud Function中的Mailgun通过触发一次发送多次
- arrays - tkinter 在操作数组?
- swift - SwiftUI - tvOS 上的 AVPlayerViewController 全屏