c++类对象指针赋值表达式必须是可修改的左值_必须知道的C语言知识细节:左值和右值知识总结...

c67c89584768bd16e5abd052c52994f2.png

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

e9c136c3cba5f982c5af103ffc18deac.png

12f84672d94895c6d37e5cc478ab760f.png
  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

表情包
插入表情
评论将由博主筛选后显示,对所有人可见 | 还能输入1000个字符
©️2021 CSDN 皮肤主题: 1024 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值