确定一个变量是否是lvalue
我的理解:判断一个变量是不是lvalue两个条件:
1. 它是否标识和定位了一块内存空间(这个条件所有变量都能满足,变量不就是对内存地址的符号化吗?所以所有变量都定位了一块内存地址)
2. 它的值是否可以改变
我的问题:
那么问题就落到值能不能改变,如何确定值能不能改变?常量和数组的值不能变我知道, 其它的呢,得靠死记?有没有判断方法?
比如:
int nums = {1, 2, 3};
int (*numsp) = &nums;
numsp为什么不能改变? 很简单,如果这个变量可以出现在等于号的左边,那这个变量就是一个 lvalue
numsp为什么不能改变?
可以改呀
int nums = {1, 2, 3};
int (*numsp) = &nums;
numsp = NULL;
人造人 发表于 2021-10-29 12:27
很简单,如果这个变量可以出现在等于号的左边,那这个变量就是一个 lvalue
不对~~
tang818875 发表于 2021-10-29 12:40
不对~~
请你举出一个反例
tang818875 发表于 2021-10-29 12:40
不对~~
这样?
的确,pa 出现在了等于号的左边,但是不是 lvalue
但是,如果这个变量可以出现在等于号的左边,那这个变量就是一个 lvalue
这个不算初始化,^_^
#include <stdio.h>
int main(void) {
int a = 123;
int *const pa = &a;
pa = NULL;
return 0;
}
人造人 发表于 2021-10-29 12:43
这样?
的确,pa 出现在了等于号的左边,但是不是 lvalue
但是,如果这个变量可以出现在等于号的左边, ...
第 6 行,因为 pa 不能出现在等于号的左边,所以 pa 不是 lvalue
本帖最后由 tang818875 于 2021-10-29 12:53 编辑
人造人 发表于 2021-10-29 12:29
numsp为什么不能改变?
可以改呀
printf("%p\n", *numsp + 1);
加这条语句编译看看 tang818875 发表于 2021-10-29 12:50
printf("%p\n", *numsp + 1);
加这条语句编译看看
这和你当前的这个问题有关系吗?我感觉没有
还有,这个代码确实可以通过编译
$ cat main.c
#include <stdio.h>
int main(void) {
int nums = {1, 2, 3};
int (*numsp) = &nums;
printf("%p\n", *numsp + 1);
return 0;
}
$ gcc -g -Wall -o main main.c
$ ./main
0xffffcc10
$
nums不能改变,numsp可以改变
不然你试试 nums++编译肯定报错,numsp++编译不会报错,只是越界了而已。 我理解:
右值是在寄存器里面可改变没有指针地址比如函数返回值。
左值是在内存里可改变有指针地址
页:
[1]