tang818875 发表于 2021-10-29 12:25:24

确定一个变量是否是lvalue

我的理解:

判断一个变量是不是lvalue两个条件:

1. 它是否标识和定位了一块内存空间(这个条件所有变量都能满足,变量不就是对内存地址的符号化吗?所以所有变量都定位了一块内存地址)

2. 它的值是否可以改变

我的问题:

那么问题就落到值能不能改变,如何确定值能不能改变?常量和数组的值不能变我知道, 其它的呢,得靠死记?有没有判断方法?

比如:


int nums = {1, 2, 3};

int (*numsp) = &nums;



numsp为什么不能改变?

人造人 发表于 2021-10-29 12:27:58

很简单,如果这个变量可以出现在等于号的左边,那这个变量就是一个 lvalue

人造人 发表于 2021-10-29 12:29:57

numsp为什么不能改变?
可以改呀

    int nums = {1, 2, 3};
    int (*numsp) = &nums;
    numsp = NULL;

tang818875 发表于 2021-10-29 12:40:09

人造人 发表于 2021-10-29 12:27
很简单,如果这个变量可以出现在等于号的左边,那这个变量就是一个 lvalue

不对~~

人造人 发表于 2021-10-29 12:40:48

tang818875 发表于 2021-10-29 12:40
不对~~

请你举出一个反例

人造人 发表于 2021-10-29 12:43:09

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:44:08

人造人 发表于 2021-10-29 12:43
这样?
的确,pa 出现在了等于号的左边,但是不是 lvalue
但是,如果这个变量可以出现在等于号的左边, ...

第 6 行,因为 pa 不能出现在等于号的左边,所以 pa 不是 lvalue

tang818875 发表于 2021-10-29 12:50:46

本帖最后由 tang818875 于 2021-10-29 12:53 编辑

人造人 发表于 2021-10-29 12:29
numsp为什么不能改变?
可以改呀

printf("%p\n", *numsp + 1);

加这条语句编译看看

人造人 发表于 2021-10-29 13:02:05

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
$


hrpzcf 发表于 2021-10-29 13:14:21

nums不能改变,numsp可以改变

不然你试试 nums++编译肯定报错,numsp++编译不会报错,只是越界了而已。

jhq999 发表于 2021-10-29 18:07:55

我理解:
右值是在寄存器里面可改变没有指针地址比如函数返回值。
左值是在内存里可改变有指针地址
页: [1]
查看完整版本: 确定一个变量是否是lvalue