注册 登录
编程论坛 C++教室

左右值@二篇

叶纤 发布于 2020-03-28 10:18, 5430 次点击
什么是左值
关于左值右值用几句话其实也能表达, 左值是具有地址(在内存中)的值。由于所有变量都有地址,因此所有变量都是左值。之所以使用左值,是因为左值是赋值语句左侧唯一的值。当我们进行赋值时,赋值运算符的左侧必须为左值。
什么是右值
 右值是指可以分配给左值的任何值。总是评估右值以产生单个值。 右值的示例是文字(例如5,其结果为5),变量(例如x,其结果为最后分配给它的值)或表达式(例如2 + x,其结果为该值) x+2)。
程序代码:
int y;      // define y as an integer variable
y = 4;      // 4 evaluates to 4, which is then assigned to y
y = 2 + 5;  // 2 + 5 evaluates to 7, which is then assigned to y

int x;      // define x as an integer variable
x = y;      // y evaluates to 7 (from before), which is then assigned to x.
x = x;      // x evaluates to 7, which is then assigned to x (useless!)
x = x + 1;  // x + 1 evaluates to 8, which is then assigned to x.

不过可以通过& 和const进行左右值的转化

关于表达式与表达语句
什么是表达式
表达式 是文字,变量,运算符,和显示函数调用的组合,他们产生单个输出值
执行表达式时,将对表达式中的每个术语进行求值,直到剩下单个值为止(此过程称为求值)。 该单个值是表达式的结果。
 根据c++标准 表达式是运算符及其操作数的序列,用于指定计算。
表达评估可能会产生结果(例如,2 + 2的评估会产生结果4),并且可能会产生副作用(例如std :: printf(“%d”,4 )的评估会在标准字符上打印字符'4'输出)。

例如
4, 'a', "Hello".是表达式的值
2 + 3,  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上。

20 回复
#2
lin51616782020-03-28 10:27
左值右值是表达式的一个属性
左值全名叫做左值表达式
是左值但不是表达式这是错的
假设 int n=10; 那么 n是一个表达式 按照你写的表达式的概念
文字,变量,运算符,和显示函数调用的组合 产生值10
符合这个概念 为什么说n不是表达式呢
认可n是表达式 n本身是左值也应该没什么疑问 毫无疑问具有地址
#3
lin51616782020-03-28 10:30
const 左右值转换这个说法不成立
按照你对左值的描述 左值具有地址
那么
int  n;
const int  m=10;
m和n都是左值 和有没有const没关系
#4
叶纤2020-03-28 10:33
回复 2楼 lin5161678
感谢大佬提供宝贵意见,这个贴有你的补充更加美好
#5
lin51616782020-03-28 10:34
int x=5+4;这一句是表达式语句
这是错的
x=5+4;才是表达式语句
你写的是定义
完全不同的概念
#6
lin51616782020-03-28 10:38
所有变量都有地址这个说法不准确 没有考虑寄存器变量
的确寄存器变量 从实现的角度未必会占用寄存器 有可能分配地址
但是从标准的角度寄存器变量就是没有地址的
比如 寄存器变量不能 做一元&操作
#7
叶纤2020-03-28 10:39
大佬你可以一起指出来吗,我非常不喜欢在第二页去看重要内容
#8
lin51616782020-03-28 10:40
顺便讲点没什么用的冷知识
对于 表达式语句 表达式是可选的
也就是说 ; 也是一个表达式语句
#9
lin51616782020-03-28 10:43
以下是引用叶纤在2020-3-28 10:39:13的发言:

大佬你可以一起指出来吗,我非常不喜欢在第二页去看重要内容

你可以在本地建立一个文档把内容都整理在一起
我喜欢这样回复
#10
叶纤2020-03-28 10:45
以下是引用lin5161678在2020-3-28 10:43:53的发言:


你可以在本地建立一个文档把内容都整理在一起
我喜欢这样回复

可是这是我的笔记文章,未来需要补充的,请大佬考虑下楼主的感受,还有这是网络时代,本地一旦清空就没了,网络上能保存个十几年

[此贴子已经被作者于2020-3-28 10:47编辑过]

#11
lin51616782020-03-28 10:47
以下是引用叶纤在2020-3-28 10:45:58的发言:


可是这是我的笔记文章,未来需要补充的,请大佬考虑下楼主的感受

论坛帖子不适合做笔记
有笔记可以考虑写到博客里面
#12
叶纤2020-03-28 10:50
以下是引用lin5161678在2020-3-28 10:47:45的发言:


论坛帖子不适合做笔记
有笔记可以考虑写到博客里面

版主大大,我请求把无关话题删掉
#13
叶纤2020-03-28 10:55
真是搞不懂,这个论坛新手就没有言论自由吗?请版主大大不要歧视新手
#14
lin51616782020-03-28 11:03
回复 13楼 叶纤
我禁言你了吗?
#15
叶纤2020-03-28 11:05
以下是引用lin5161678在2020-3-28 11:03:09的发言:

我禁言你了吗?

如果您有这个权利,禁言我,拉黑我,我也会认为是应该的
#16
lin51616782020-03-28 11:22
言论自由是发表言论的自由
既然你没有被禁言 那么谈不上限制言论自由
不懂的词不要随便用
#17
叶纤2020-03-28 11:27
以下是引用lin5161678在2020-3-28 11:22:12的发言:

言论自由是发表言论的自由
既然你没有被禁言 那么谈不上限制言论自由
不懂的词不要随便用

可是你说过
以下是引用lin5161678在2020-3-28 10:47:45的发言:
论坛帖子不适合做笔记
有笔记可以考虑写到博客里面
#18
叶纤2020-03-28 11:29
一个版主对于一个新手说17楼的话听起来有点像逐客令
#19
lin51616782020-03-28 11:36
回复 17楼 叶纤
我指出 帖子不适合做笔记
所以 帖子的内容符合笔记格式的要求不成立
至于你是不是依然要用帖子做笔记 我也没拦着你
但格式不符合要求你只能自己忍了
#20
叶纤2020-03-28 11:41
请教一下,那你平时做笔记是什么格式的?我很想学习
#21
lin51616782020-03-28 12:01
以下是引用叶纤在2020-3-28 11:41:10的发言:

请教一下,那你平时做笔记是什么格式的?我很想学习

没笔记
1