计算结果能够引用内存地址的表达式被称为“左值 (l-value)”表达式。左值代表了一个存储区域的“定位地址”值或“左”值,表名它可以出现在等号 (=
) 的左侧。左值通常是标识符 (identifier)。
引用可修改的内存地址的表达式叫“可修改的左值”。可修改的左值不能是数组类型、不完整的类型,或是使用 const
修饰的类型。若想要把结构体和联合作为可修改的左值,那么它们的任何成员都不可以使用 const
修饰。标识符的名字代表了一个存储位置,而标识符指代的变量的值是该存储位置中存放的值 (数据)。
如果一个标识符指代了某个内存地址,同时其类型是算术型的 (比如 int
和 float
)、结构体、联合或是指针,那么这个标识符就是可修改的左值。举个例子,如果 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 限定用法说明结束