概述

一些编程语言使用 L 值和 R 值的概念,这源自赋值语句中左右两边典型的求值模式。L 值指的是一个在单个表达式之外仍然存在的对象。R 值则是一个临时值,它不会在使用它的表达式之外存在。

讨论

L 值和 R 值分别指代赋值运算符的左侧和右侧。L 值(发音:L value)概念要求赋值运算符左侧的操作数是可修改的,通常是一个变量。R 值概念则表示从赋值运算符右侧的表达式或操作数中取出值。以下是一些例子:

age = 39

值 39 是从右侧的表达式中取出(R 值),并存储到名为 age 的变量中(L 值),从而销毁该变量之前存储的值。

voting_age = 18
age = voting_age

如果赋值表达式右侧是一个变量或命名常量,那么它会从该变量或常量中取出值并存储。值 18 会从变量 voting_age 中取出并存储到变量 age 中。

age < 17

如果表达式是一个测试表达式或布尔表达式,概念上仍然是一个 R 值。在这种情况下,标识符 age 中的值会被取出并用于小于的关系比较。

JACK_BENNYS_AGE = 39
JACK_BENNYS_AGE = 65;

这是非法的,因为标识符 JACK_BENNYS_AGE 不具备 L 值属性。它不是一个可修改的数据对象,因为它是一个常量。

**L 值和 R 值的某些用法可能会让人困惑,尤其是在支持递增和递减运算符的语言中。**考虑以下情况:

oldest = 55
age = oldest++

后缀递增运算符表示先使用现有的值,然后在完成其他运算符后再递增。因此,第一次使用 oldest 变量时,它处于 R 值上下文中,现有值 55 被取出并赋值给变量 age,这时是 L 值上下文。第二次使用 oldest 变量时,它处于 L 值上下文,变量 oldest 的值从 55 增加到 56。

关键术语

  • L 值:赋值运算符左侧操作数的要求是可修改的,通常是变量。
  • R 值:从变量或常量中提取存储的值。

参考文献

  • cnx.org: 《编程基础 - 使用 C++ 的模块化结构化方法》
  • Wikipedia: 《值(计算机科学)》
最后修改: 2025年01月10日 星期五 15:49