L值与C中的R值
我正在回答这本教科书中的教科书问题。
我正在学习C中的指针,并且遇到了l值和r值。 根据我的理解:
l-values are values that are defined after they are executed (++x) r-values are values that are not defined after they are executed (x++)
这是正确的吗?
我想回答的问题(我的尝试):
a) Which of the following C expressions are L-Values? 1. x + 2 Not a L value 2. &x Is a L value 3. *&x Is a L value 4. &x + 2 Not a L value 5. *(&x + 2) Is a L value 6. &*y Is a L value b) Is it possible for a C expression to be a L-value but NOT a R-value? Explain I've read that a L value can be a R value but not vice versa. I can't think of an example of something being an L value but not a R value. c) Is &(&z) ever legal in C? Explain Assuming this is not legal since a memory address doesn't have its own memory address?
我接近了吗? 谢谢
l值是执行后定义的值(
++x
)r值是执行后未定义的值(x++
)
不,那不对。
单词“左值”和“右值”(这就是C标准拼写它们的方式)有着悠久的历史。 术语来自“左”的“l”和“右”的“r”,指的是赋值的左侧和右侧。
在某些上下文中,表达式可以针对其左值 进行求 值 ,也可以针对其右 值 进行求值 。 鉴于这些术语的定义,“rvalue”是您通常认为的表达式的值; 评估2+2
收益率4
。 评估其左值的表达式意味着确定它所引用的对象。 例如,给定:
int x; x = 2 + 2;
在赋值的右侧, 2 + 2
将被评估其右值,产生4
,左侧将被评估其左值,这意味着确定它所引用的对象。 ( 不计算表达式的rvalue;不使用先前存储在x
的值,如果有的话。)
C标准对它们的定义不同。 在C中, 左值不是值; 这是一种表达方式。 具体而言,引用2011 ISO C标准,第6.3.2.1节:
左值是一个表达式(对象类型不是void)可能指定一个对象; 如果左值在评估时未指定对象,则行为未定义。
(添加“潜在”一词来覆盖像*ptr
这样的情况,其中ptr
是一个指针对象;如果ptr == NULL
则*ptr
当前不指定一个对象,但它仍然是一个左值。你总是可以在编译时确定是否给定表达式是左值的时间。早期版本的C标准对左值有缺陷。)
因此,C语言中的左值基本上是指定对象的表达式。 您可以将其视为可以出现在作业左侧的表达,尽管这并不完全准确; 例如, const
对象的名称不能在赋值的LHS上,但它仍然是左值。 (正如您所看到的,确定左值的精确且一致的定义可能很棘手。)
x++
和++x
都不是C ++x
中的左值。
C标准不使用rvalue这个术语,而是在一个脚注中提到它:
有时被称为“rvalue”的内容在本国际标准中被描述为“表达的价值”。
因此,当C定义术语时, 左值是一种表达式(C源代码中存在的东西),但是右值是评估表达式的结果(在程序执行期间存在的东西)。
(C ++有不同的规则,以及其他几个类似于左值的东西,包括glvalues等等。我不会在这里讨论。)