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

在C语言当中,我们经常会遇见一些平时感觉怎么用都不会出错的小知识点,但是再将它的难度提高一点点的时候,或者将它改变一点点,我们就不再将它用起来那么的得心应手。左值和右值正是一个这样的十足十的例子。在学习了指针知识之后,高度理解左值与右值便不再显得那么的无聊。这个解释看起来有点傻,但是不得不说:左值就是那些能够出现在赋值符号左边的东西,右值就是那些能够出现在赋值符号右边的东西。例如:a=b+25;这…

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

在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.net/127557.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 自监督学习: 人工智能的未来

    自监督学习: 人工智能的未来目录1.什么是自监督学习?2.为什么自监督学习是AI的未来?3.1ComputerVision:[1]2015(ICCV)UnsupervisedLearningofVisualRepresentationsUsingVideos[2]2015(ICCV)UnsupervisedVisualRepresentationLearningbyContextPrediction[3]2016(ECCV)Unsupervisedlearni

    2025年11月17日
    7
  • mysql查询语句执行过程及运行原理命令_MySQL常用命令

    mysql查询语句执行过程及运行原理命令_MySQL常用命令Mysql查询语句执行原理数据库查询语句如何执行?DML语句首先进行语法分析,对使用sql表示的查询进行语法分析,生成查询语法分析树。 语义检查:检查sql中所涉及的对象以及是否在数据库中存在,用户是否具有操作权限等 视图转换:将语法分析树转换成关系代数表达式,称为逻辑查询计划; 查询优化:在选择逻辑查询计划时,会有多个不同的表达式,选择最佳的逻辑查询计划; 代码生成:必须将逻辑查…

    2025年6月9日
    3
  • 一点想法

    一点想法

    2021年8月23日
    65
  • 超强物联网架构解读图_物联网的体系架构是什么

    超强物联网架构解读图_物联网的体系架构是什么oT科技物语的小伙伴们,我是ICE青,特别喜欢金庸大师作品的ICE青。因此,本期开始我将为大家介绍《物联网平台之独孤九剑》,看万物互联的世界何以笑傲江湖——「总决式」:物联网概述和架构「破剑式」:OceanConnect物联网平台概述「破刀式」:OceanConnect物联网特性概述「破枪式」:业务流程「破鞭式」:北向API「破索式」:南向Profile「破掌式」:…

    2026年1月14日
    7
  • Java编程新手入门要多久[通俗易懂]

    Java编程新手入门要多久[通俗易懂]1.Java是什么?Java是一门面向对象编程语言,不仅吸收了C++语言的各种优点,还摒弃了C++里难以理解的多继承、指针等概念,因此Java语言具有功能强大和简单易用两个特征。Java语言作为静态面向对象编程语言的代表,极好地实现了面向对象理论,允许程序员以优雅的思维方式进行复杂的编程。Java具有简单性、面向对象、分布式、健壮性、安全性、平台独立与可移植性、多线程、动态性等特点。J…

    2022年5月21日
    45
  • python fileinput_python模块fileinput

    python fileinput_python模块fileinput在python脚本语言中的fileinput模块可以对一个或多个文件的内容进行迭代,编历操作.常用的函数:fileinput.input()#读取文件的内容fileinput.filename()#文件的名称fileinput.lineno()#当前读取行的数量fileinput.filelineno()#读取行的行号fileinput.isfir…

    2022年5月4日
    37

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号