左值与右值

文章详细阐述了C语言中左值和右值的概念,解释了它们在内存、赋值操作以及函数调用中的差异。左值表示内存区域,可以被赋值;右值是表达式的值,不一定占用存储空间。讨论了数组、指针、常量和函数返回值在左右值上下文中的行为,并举例说明了编译器如何处理这些情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

红叶何时落水

 左值(左值表达式)是表示内存区域(对象)的表达式,而右值(右值表达式)是表达式的值。左值一般可以被赋值
 左值一定会(在程序运行的某一段时间)占用存储空间,但右值则不必。
 int n = 1;  其中m,n都是左值,因为他们都是一个可储存的地址
 int m = 2;
 m = n;  但在这里,n是右值,m是左值,n赋值给m; 原因便是编译器的隐式转换,在汇编中n的值从内存中取出,放到寄存器堆中,然后再写入m的内存地址

 普通的常量是右值,存放在flash中,只可以读取其值
 字符串常量是左值  
 char str1[]="abcd";//字符串字面量初始化数组
 char* str2="abcd";//执行了自动转换
 char (*str3)[5]=&"abcd";//取左值的地址 
 凡是用到lw指令的都是右值,sw指令的都是左值
 &左值 得到一个地址右值
 *左值/右值 得到一个左值 可以存放新的右值
 a++ => 右值 a 
 ++a => 左值 a = a + 1
 函数return一个右值 因此func() = 3;不合法 return利用寄存器堆暂时保存右值,其实寄存器里的值就是右值
 当函数返回一个结构体时,其实是不合理的,因为寄存器堆放不下结构体的所有值
 所以编译器会将你的函数修改

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

红叶落水

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值