C语言中左值和右值概念是来自赋值或复合赋值表达式。初学者会很容易迷惑,这里给出这两个概念总结。
对于赋值表达式E1=E2,其中E1必须是可修改的左值,E2是右值。
左值:简写lvalue,left value
右值:简写rvalue,right value
例如:int m = 1; 很明显m是左值,1是右值。
左值是指向内存区域的对象,左值可以出现赋值表达式的左边或右边,当左值出现的右边时,自动转换为右值使用。
右值是指存储在内存中的数值本身,右值不能出现的赋值表达式左边,否则编译出错。
例如:
int m,n;
m = 1; // 合法,m是左值
n = m; // 合法,n是左值,m自动转换为右值
1 = m; // 不合法,1是常量,只能作为右值
1 = 2; // 不合法,1是右值
C语言中左值要求是变量,包括以下情况:
基本类型的变量:char int float double 型变量
枚举类型变量
数组类型下标成员访问:例如 a[i] = 1
结构类型变量或成员变量
联合类型变量或其成员变量
指针类型:两种情况
int *p ;
p = (int *)(0x0000fffff); // 指针本身赋值
*p = 1; // 指针指向的对象赋值
以下几种特殊情况的变量不能作为左值:
如果以上变量,有const关键字修饰,相当于常量,只能作为右值。
对于数组名本身,无法作为左值,只能作为右值,表示地址常量。例如 int a[100]; a是数组名,本身无法作为左值,a[i]是数组成员可以作为左值。
函数名无法作为左值,只能作为右值,表示地址常量。
右值:可以是变量、常量和表达式。
左值所有情况均可以作为右值。
常量,例如 1 'a' 100.01 0xffffffff等。
表达式,表达式不是变量,即使表达式中含有变量,表达式最终的结果是一个右值。例如 m+n 1+m i++ 等。
数组名、函数名、const修饰的变量
例如:
int i = 0;
i++ = 2; // 不合法,i++是表达式,只能作为右值
int a,b,c;
a=b=c=1; // 合法,最终a,b,c都等于1
a=(b=c)=1; // 不合法,(b=c)是表达式是右值,无法再赋值1
int a[100];
a[0] = 1; // 合法,数组成员是左值
int *p = a; // 合法,数组名可以作为地址常量
a = &p; // 不合法,数组名不能作为右值
const int i = 1; // 只读变量初始化
i = 2; // 不合法,只读变量无法再赋值
int j = i; // 合法,const变量可以作为右值
其实做为一个学习者,有一个学习的氛围跟一个交流圈子特别重要这里我推荐一个C/C++基础交流583650410,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。


网友评论