首页 > 解决方案 > c和c ++中左值的含义是否不同?

问题描述

有人告诉我,数组名称是 C 中不可修改的左值,但它仍然令人困惑。

有人说数组名不能放在公式的左边,因为它被转换为非左值的指针。

我的问题在这里:

  1. 是数组名左值吗?
  2. c 和 c++ 中的 l-value 的含义有什么区别吗?

标签: c

解决方案


  1. 是数组名左值吗?

是的,在 C 和 C++ 中。

  1. 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++ 中,数组的标识符表示一个对象——数组——因此它是一个左值。这样的左值实际上是否可以作为赋值表达式中的左操作数出现是一个完全独立的问题。


推荐阅读