前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >关于左值和右值的一些问题总结[通俗易懂]

关于左值和右值的一些问题总结[通俗易懂]

作者头像
全栈程序员站长
发布2022-07-25 13:27:07
3680
发布2022-07-25 13:27:07
举报
文章被收录于专栏:全栈程序员必看

大家好,又见面了,我是你们的朋友全栈君。

在C语言当中,我们经常会遇见一些平时感觉怎么用都不会出错的小知识点,但是再将它的难度提高一点点的时候,或者将它改变一点点,我们就不再将它用起来那么的得心应手。左值和右值正是一个这样的十足十的例子。在学习了指针知识之后,高度理解左值与右值便不再显得那么的无聊。

这个解释看起来有点傻,但是不得不说:

左值就是那些能够出现在赋值符号左边的东西,右值就是那些能够出现在赋值符号右边的东西。

例如:a=b+25;

这里,a是左值,它标识了一个可以存储结果值的点,也就是说,他有一个可以自己掌控的固定的空间,b+25是右值,因为他指定了一个值。

那么他们可以互换吗?

例如:b+25=a;

答案当然是不可以;

注意,当计算机计算b+25时它的结果必然保存在机器的某个地方。但是程序员并没有办法预测该结果会存储在什么地方,也无法保证下一次这个表达式的值仍然会存在原来的那个地放。其结果就是b+25不能当左值。因为他没有固定的标识一个点。

但是a可以作为一个右值,因为每个位置都包括了一个值。

所以总结了来看:

左值:我们主要用他的空间 ;

右值:我们主要用他的值。

字面值常量都不能为左值。

为了巩固上面的所学理论,也为了让我们更加的了解怎么回事,我们现在开始将下面的例子深入讨论:

当有代码:

char ch=‘a’;

char *cp=&ch;

那我们来看看下面的代码是什么意思?能否做左值?能否做右值?

&ch; //&ch是地址常量,只能做左值,不能做右值;

cp; //cp是一个变量,既有存储空间,又有值,所以左值和右值都可以做;

&cp; //&cp是地址常量,只能做右值,不能做左值。

*cp+1; //它的运算顺序是,现将cp解引用,再将cp的值加1,所以是一个常量(在本题中,他表示给a+1,也就是字符b),只能做右值,不能左值;

*(cp+1); //这里的运算表示ch之后的一块空间(读取cp下一个空间的内容),既可以做左值,又可以做右值;

++cp; //这里表示给ch的地址加1,也就是给地址常量加1,可以做右值,不可以做左值

cp++; //理由与++cp的理由相同

*++cp; //先自加,在解引用,表示了ch的下一个空间(读取下一个空间的内容),既可以做左值,又可以做右值;

*cp++; //理由同上;

(*cp)++; //表示将ch的地址加1,是一个常量,不可以做左值,但是可以做右值;

++*++cp; //表示对ch下一块空间地址的前置++,是一个常量,不可以做左值,但是可以做右值;

++*cp++; // 表示对ch的空间地址先前置++,在后置++,是一个常量,不能做左值,但是可以做右值。

好了,先到这里吧

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/127557.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2022年4月1,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档