必须知道的C语言知识细节:左值和右值知识总结

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,不管你是小白还是转行人士欢迎入驻,大家一起交流成长。

你可能感兴趣的:(C/C++,赋值表,编程语言)