#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)
我这样写的,所以就是它就是一个左值了?
求各位大佬解答一下。
1
hello2090 181 天前 via iPhone
不太记得 C++了,但是 ((char*)d)++ 看起来怪怪的,我猜你写成+1 没问题?
|
2
amiwrong123 OP |
3
XiaoxiaoPu 181 天前 1
type cast 产生的是 r-value ,因此 ((char*)d) 是 r-value 。++ 运算符需要 l-value, 所以会报错。
|
4
chenyu0x00 181 天前 1
因为++运算符会修改 d 的值,而((char*)d)看起来被识别为了右值,只能读不能修改,所以就报错了。
1 楼的换成+1 没问题是因为+1 不会修改值,所以((char*)d)被被识别为了右值也没问题。 value2 那里没有出问题我猜是先计算了++运算,表达式变成了这样:*( (char*)(d++) ) |
5
amiwrong123 OP |
7
aresyang 180 天前
@amiwrong123 抽象机器 locate 值
|
8
cnbatch 180 天前 1
左值右值的概念在 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 语言发明者并未直接使用“右值”这个说法,而是讲“非左值” |