左值和右值表达式

计算结果能够引用内存地址的表达式被称为“左值 (l-value)”表达式。左值代表了一个存储区域的“定位地址”值或“左”值,表名它可以出现在等号 (=) 的左侧。左值通常是标识符 (identifier)。

引用可修改的内存地址的表达式叫“可修改的左值”。可修改的左值不能是数组类型、不完整的类型,或是使用 const 修饰的类型。若想要把结构体和联合作为可修改的左值,那么它们的任何成员都不可以使用 const 修饰。标识符的名字代表了一个存储位置,而标识符指代的变量的值是该存储位置中存放的值 (数据)。

如果一个标识符指代了某个内存地址,同时其类型是算术型的 (比如 intfloat)、结构体、联合或是指针,那么这个标识符就是可修改的左值。举个例子,如果 ptr 是指向存储区域的指针,那么 *ptr 就是指派给 ptr 所指向的存储区域的一个可修改的左值。

下列的任何一个 C 表达式都可以是左值表达式:

  • 整数、浮点数、指针、结构体或联合类型的标识符
  • 取值结果不是数组的下标表达式 ([])
  • 成员选择表达式 (->.)
  • 解引用的结果不是数组的一元解引用表达式 (*)
  • 使用圆括号包围的左值表达式
  • const 修饰的对象 (即不可修改的左值)

术语“右值 (r-value)”有时被用来描述表达式的值,并且用于区分左值。所有的左值都是右值,而并非所有的右值都是左值。

Microsoft 限定用法说明

Microsoft C 包含了对 ANSI C 标准的一个扩展,它允许将对左值的类型转化 (cast) 作为新的左值使用。其要求是对象的空间占用不会因为类型转化而加大。(关于类型转化的更多信息,请参阅 Type-Cast Conversions) 下面的例子演示了这个特性:

char *p ;
short  i;
long l;

(long *) p = &l ;       /* 合法类型转化   */
(long) i = l ;          /* 非法类型转化 */

默认情况下 Microsoft C 会启用这些 Microsoft 扩展。使用 /Za 编译器选项可以禁用这些扩展。

Microsoft 限定用法说明结束

另见

Operands and Expressions

相关链接

  1. 原文: L-Value and R-Value Expressions
  2. 归档: L-Value and R-Value Expressions | Translation Archives
posted @ 2023-11-22 00:00  那阵东风  阅读(37)  评论(0编辑  收藏  举报