注册 登录
编程论坛 C语言论坛

那位大佬能否用简单明了的一句话说明一下,左值右值的区别

Knightl8 发布于 2020-03-10 15:42, 2718 次点击
谢谢大家了
16 回复
#2
rjsp2020-03-10 16:10
没办法
C语言值类别:https://zh.
C++语言值类别:https://zh.

#3
自学的数学2020-03-10 16:53
左值:标识的应该是个存储位置,内存中的位置,左值可以是个变量名,或者是个表达式,但表达式必须表示的是个内存位置

右值:就是个值,变量的值,表达式的值
#4
叶纤2020-03-10 17:27
这是一下庞大的知识量,不是几句话可以讲清的,我也是刚知道有左值和右值的存在,总结了一下少部分知识点
左值就像一个大空桶子,里面有空间,可以在里面装东西呀,当然能装东西就能从空桶里取出东西来,当然空桶里的东西怎么摆放是你自己的事了,取出来只需要看地址就行了,
右值就像一个地板,如果一个物体(比如花瓶)暂时不需要放进大空桶里,就先放地上,等什么时候花瓶看腻了再把它从地板上拿出来然后在放进空桶里,不过你拿花瓶是从地板上拿的,地板只是个临时放东西的地方
#5
八画小子2020-03-10 22:48
在C语言程序设计中需要清晰地分辨真值、右值、左值这三个概念。
真值:仅仅具有数值的概念,再无任何其他的意义。可以和数学中的整数和小数等同。
右值:有了数据类型的意义,也有了在该数据类型上可执行的操作。对于整型、浮点型这些简单数据类型的变量,其右值等价于其真值,在其上可以执行加减乘除以及其他的数学运算;对于数组、结构体等复杂数据类型的变量,没有真值的概念,但具有特定的操作。右值仅仅是个逻辑概念,在内存中并不存在。
左值:左值与右值的不同,仅仅是在内存中存在一个内存空间,如果按数据类型的角度将该内存空间的值读取出就可以得到右值。

一些情况下,对于真值,我们可以对其进行强转变成另一种数据类型,但此时得到的不是真值而是右值。比如对于char类型的变量,我们可以强转成int类型;也可以反过来强转,只是其真值可能会发生变化。
一些情况下,对于右值,我们也可以对其进行强转,用得最多的情况是将某一种指针类型的对象转换成另一种指针类型,但是其真值并没有发生变化,还是那个地址编号。
通常,我们不会对左值进行强转。一般是强转得到其的右值,然后进行读取或写入操作。

以上就是一点理解吧,很有可能是有一些错误,感谢群里的其他大神帮忙指正。本着不误人子弟的原则,建议大家也参考其他的文献资料。
#6
lin51616782020-03-11 11:17
以下是引用自学的数学在2020-3-10 16:53:27的发言:

左值:标识的应该是个存储位置,内存中的位置,左值可以是个变量名,或者是个表达式,但表达式必须表示的是个内存位置

右值:就是个值,变量的值,表达式的值

你对表达式的理解有问题
左值也好
右值也好
变量名也好
都属于表达式

可以是个变量名,或者是个表达式
这是一个病句 雷同于 可以是个男人 或者是个人
#7
叶纤2020-03-11 13:39
以下是引用lin5161678在2020-3-11 11:17:57的发言:


你对表达式的理解有问题
左值也好
右值也好
变量名也好
都属于表达式

可以是个变量名,或者是个表达式
这是一个病句 雷同于 可以是个男人 或者是个人

你对表达式理解有误区啊
#8
叶纤2020-03-25 00:14
关于左值右值用几句话其实也能表达, 左值是具有地址(在内存中)的值。由于所有变量都有地址,因此所有变量都是左值。之所以使用左值,是因为左值是赋值语句左侧唯一的值。当我们进行赋值时,赋值运算符的左侧必须为左值。
 右值是指可以分配给左值的任何值。总是评估右值以产生单个值。 右值的示例是文字(例如5,其结果为5),变量(例如x,其结果为最后分配给它的值)或表达式(例如2 + x,其结果为该值) x+2)。
不过可以通过& 和const进行左右值的转化
#9
lin51616782020-03-25 00:51
回复 7楼 叶纤
请指教
#10
叶纤2020-03-25 10:05
回复 9楼 lin5161678
您说左值和右值都属于一个表达式
以下说法是我从学习网站里了解来的。当然可能和c语言有些碰撞,不过像表达式表达语句应该碰撞的比较少
先说说第一个   表达式
表达式 是文字,变量,运算符,和显示函数调用的组合,他们产生单个输出值
执行表达式时,将对表达式中的每个术语进行求值,直到剩下单个值为止(此过程称为求值)。 该单个值是表达式的结果
例如


 4, 'a', "Hello".是表达式的值
2 + 3, x, x + 4是表达式

    表达式语句是由一个表达式和一个分号组成的语句。 执行该语句时,将对表达式进行求值(并且将舍弃表达式的结果)。

int x=5+4;这一句是表达式语句

如果对舍弃表达式的结果不明白
就拿上面表达式语句举例吧
5+4=9会把最后的值9赋值给x,然后丢掉表达式的结果
在c++表达式语句有可能很有用,有可能很没用,在c中应该是同样的吧
比如
3+2;是个很没用的表达式,因为在执行他的时候将会丢掉5
int x=5+4;是个很有用的表达式,当9丢掉的时候但是已经分配给x使用了
在c++中
如何看待cout<<1+2;呢?
直接复制。。。
堆积在CPU上或压入堆栈(RAM)。
如果将值压入堆栈,则@std :: cout.operator <<完成后将弹出该值。 请注意,堆栈没有与RAM中的其他值混合。 它有自己的保留空间。
 2)
 1和2不在内存中。 该表达式是在编译时求值的,因此3与构成您代码的字节一起存储。 它不与其他值混合,因为代码在RAM中获得了自己的空间。 根据调用约定,将3压入堆栈或保留在CPU上。
(涉及硬件上的东西我也不怎么理解,总之cout1<<1+2;和直接1+2;不一样,)



[此贴子已经被作者于2020-3-25 11:08编辑过]

#11
叶纤2020-03-25 11:22
看看和你的知识有没有碰撞的
如果有知识碰撞的地方,请说一下理论知识,

[此贴子已经被作者于2020-3-25 12:20编辑过]

#12
lin51616782020-03-25 12:01
表达式 是文字,变量,运算符,和显示函数调用的组合,他们产生单个输出值

错的 有的表达式没有值比如

void foo(){}
foo()//是一个表达式 但是没值


然后 我说 左值右值都是属于表达式
我没看到你这段话和我的描述有什么冲突
这段话有说
左值不是表达式
还是有说右值不是表达式??
#13
叶纤2020-03-25 12:09
您说的foo属于函数调用,在我说的定义里面,
那你把你所理解的表达式与表达语句,说一遍吧,我已经长篇小说式的说出来了
现在换你了
我会很认真的听大大的理论知识的
还有这事我的收藏帖,不要说太多无意义的话,知识理论优先

[此贴子已经被作者于2020-3-25 12:11编辑过]

#14
lin51616782020-03-25 12:15
回复 13楼 叶纤
你说的定义里面 foo()属于表达式
你说表达式都有值
而foo()没有值
这就前后矛盾了

注意重点不是foo()是不是表达式
重点是foo()有没有值
#15
lin51616782020-03-25 12:40
回复 13楼 叶纤
表达式是运算符及其运算数的序列,它指定一个运算。

表达式的概念
#16
叶纤2020-03-25 12:43
以下是引用lin5161678在2020-3-25 12:40:39的发言:

表达式是运算符及其运算数的序列,它指定一个运算。

表达式的概念

。。。。好吧,我写了上百字的理论,我以为你也会写的很长呢,,,,
#17
lin51616782020-03-25 12:47
回复 16楼 叶纤
表达式的概念本来就这么简单
左值右值是表达式一个属性
左值其实是简写全名是左值表达式
我说左值属于表达式 你说我对表达式有误解
但是你写了几百个字我还是没看到有什么误解
1