关于C语言rvalue概念的疑问:《C Primer Plus》定义是否准确?
关于C语言左值(lvalue)与右值(rvalue)定义的疑问
《C Primer Plus(第六版)》中文版中对Rvalue的定义:指可被赋值给可修改左值、自身不是lvalue的值。
我对这个定义的正确性存疑,编写代码时产生了困惑,代码如下:
#include <stdio.h> int main(void) { int a = 3; // ok because 3 is constant int b = 3 + 4; // ok because 3+4 is expression int c = a; // ? a is rvalue /* a是lvalue,这与书中定义的“rvalue自身不是lvalue”是否矛盾?此前未注意到这个基础问题,希望有人能解答。 */ return 0; }
我认为a本身是lvalue,想请教书中的该定义是否正确?
解答
首先要明确:C语言中,lvalue和rvalue是表达式的属性,而非变量自身的固定属性。
变量a作为一个表达式时,在不同语境下会有不同的属性:
- 当你写
a = 5;时,a是lvalue表达式——它代表一块可修改的内存空间,能被赋值。 - 当你写
int c = a;时,a在这里会被转换为rvalue——编译器会读取它存储的值,这个值就是右值,而此时a作为表达式的右值属性,和它本身是lvalue变量并不冲突。
《C Primer Plus》中文版的这个定义存在表述上的误导,正确的理解应该是:
- lvalue表达式:代表一个对象(内存空间),可以出现在赋值运算符的左侧(可修改lvalue),或者用于获取对象的地址(比如
&a)。 - rvalue表达式:代表一个值,它要么是字面常量(比如
3),要么是表达式计算的结果(比如3+4),要么是从lvalue转换而来的“值内容”(比如int c = a;中的a)。rvalue不能被赋值,也不能取地址。
你遇到的情况并不矛盾:a本身是一个lvalue变量,但当它出现在赋值运算符右侧时,会被隐式转换为rvalue(即它存储的值),这完全符合C语言的规则,是书中的定义表述不够严谨导致的误解。
内容的提问来源于stack exchange,提问作者earearlength
相关产品推荐
相关产品推荐

