为什么指针的临时变量会报错 lvalue required as increment operand

27 天前
 amiwrong123
#include <stdio.h>

int main() {
    char arr[10] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' };
    char *d = arr;

    char value1 = *(((char*)d)++);//这里会报错
    d = arr;
    char value2 = *((char*)d++);

    printf("value1: %c, value2: %c\n", value1, value2);

    return 0;
}

gcc test.c -o test
test.c: In function ‘main’:
test.c:8:31: error: lvalue required as increment operand
    8 |     char value1 = *(((char*)d)++);
      | 

可能我对编译和 c 这块不是很懂,这个左值不是 c++的概念吗,怎么我这么编译还能报错啊?

然后就是这个报错信息没看懂,((char*)d)我这样写的,所以就是它就是一个左值了?

求各位大佬解答一下。

781 次点击
所在节点    程序员
8 条回复
hello2090
27 天前
不太记得 C++了,但是 ((char*)d)++ 看起来怪怪的,我猜你写成+1 没问题?
amiwrong123
27 天前
@hello2090 #1
写成+1 没问题?

是的,不会报错的。我只是在想,为啥这样写会报错。
XiaoxiaoPu
27 天前
type cast 产生的是 r-value ,因此 ((char*)d) 是 r-value 。++ 运算符需要 l-value, 所以会报错。
chenyu0x00
27 天前
因为++运算符会修改 d 的值,而((char*)d)看起来被识别为了右值,只能读不能修改,所以就报错了。
1 楼的换成+1 没问题是因为+1 不会修改值,所以((char*)d)被被识别为了右值也没问题。
value2 那里没有出问题我猜是先计算了++运算,表达式变成了这样:*( (char*)(d++) )
amiwrong123
27 天前
@XiaoxiaoPu #3
OK ,大概理解了。还有个问题,我这不是纯 c 编译吗,怎么还有左值右值的概念。

我一直以为只有 c++有左值右值的概念。

原来纯 c 也有啊
PTLin
27 天前
aresyang
27 天前
@amiwrong123 抽象机器 locate 值
cnbatch
27 天前
左值右值的概念在 C++出现前就已经在纯 C 当中存在了:

https://www.stroustrup.com/terminology.pdf
引用开头一段话:
The terms “lvalue” and “rvalue” are deep in C++’s genes. They were introduced by Christopher Strachey for CPL [Strachey,196?]

还有

Dennis Ritchie used “lvalue” to describe C (e.g. see [K&R,1978]), but left out “rvalue”, considering “lvalue” and “not lvalue” sufficient.
此时 C 语言发明者并未直接使用“右值”这个说法,而是讲“非左值”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1045454

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX