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

查看 42|回复 5
作者:amiwrong123   
#include
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)我这样写的,所以就是它就是一个左值了?
求各位大佬解答一下。
hello2090   
不太记得 C++了,但是 ((char*)d)++ 看起来怪怪的,我猜你写成+1 没问题?
amiwrong123
OP
  
@hello2090 #1
写成+1 没问题?
是的,不会报错的。我只是在想,为啥这样写会报错。
XiaoxiaoPu   
type cast 产生的是 r-value ,因此 ((char*)d) 是 r-value 。++ 运算符需要 l-value, 所以会报错。
chenyu0x00   
因为++运算符会修改 d 的值,而((char*)d)看起来被识别为了右值,只能读不能修改,所以就报错了。
1 楼的换成+1 没问题是因为+1 不会修改值,所以((char*)d)被被识别为了右值也没问题。
value2 那里没有出问题我猜是先计算了++运算,表达式变成了这样:*( (char*)(d++) )
amiwrong123
OP
  
@XiaoxiaoPu #3
OK ,大概理解了。还有个问题,我这不是纯 c 编译吗,怎么还有左值右值的概念。
我一直以为只有 c++有左值右值的概念。
原来纯 c 也有啊
您需要登录后才可以回帖 登录 | 立即注册

返回顶部