红叶何时落水
左值(左值表达式)是表示内存区域(对象)的表达式,而右值(右值表达式)是表达式的值。左值一般可以被赋值
左值一定会(在程序运行的某一段时间)占用存储空间,但右值则不必。
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利用寄存器堆暂时保存右值,其实寄存器里的值就是右值
当函数返回一个结构体时,其实是不合理的,因为寄存器堆放不下结构体的所有值
所以编译器会将你的函数修改

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

被折叠的 条评论
为什么被折叠?



