左值和右值表达式
引用内存位置的表达式称为“左值”表达式。 左值表示存储区域的“locator”值或“left”值,并暗示它可以出现在等号 ( =
) 的左侧。 左值通常是标识符。
引用可修改的位置的表达式称为“可修改的左值”。可修改的左值不能具有数组类型、不完整类型或包含 const
特性的类型。 要使结构和联合成为可修改的左值,它们必须没有任何包含 const
特性的成员。 标识符的名称表示存储位置,而变量的值是存储在该位置的值。
如果标识符引用内存位置且如果其类型为算术、结构、联合或指针,则该标识符是可修改的左值。 例如,如果 ptr
是指向存储区域的指针,则 *ptr
是指定 ptr
所指向的存储区域的可修改的左值。
以下任一 C 表达式可为左值表达式:
整型、浮点、指针、结构或联合类型的标识符
计算结果不为数组的下标 (
[ ]
) 表达式成员选择表达式(
->
或.
)不引用数组的一元间接寻址 (
*
) 表达式包含在括号内的左值表达式
const
对象(不可修改的左值)
术语“右值”有时用于描述表达式的值以及将其与左值区分开来。 所有左值都是右值,但并不是所有右值都是左值。
Microsoft 专用
Microsoft C 包括对 ANSI C 标准的扩展,该扩展允许将左值的转换用作左值,只要对象的大小不通过转换来扩展即可。 (有关详细信息,请参阅类型强制转换。)以下示例演示了此功能:
char *p ;
short i;
long l;
(long *) p = &l ; /* Legal cast */
(long) i = l ; /* Illegal cast */
Microsoft C 的默认设置是启用 Microsoft 扩展。 使用 /Za 编译器选项禁用这些扩展。
结束 Microsoft 专用