当铸造指针有增量运算符时会发生什么?

hop*_*pia 13 c c++ compiler-construction pointers programming-languages

例如:

int x[100];
void *p;

x[0] = 0x12345678;
x[1] = 0xfacecafe;
x[3] = 0xdeadbeef;

p = x;
((int *) p) ++ ;

printf("The value = 0x%08x", *(int*)p);
Run Code Online (Sandbox Code Playgroud)

编译上面的代码会在++运算符的行上生成一个左值所需的错误.

Fre*_*Foo 18

强制转换创建一个类型的临时指针int *.您不能增加临时值,因为它不表示存储结果的位置.

在C和C++标准中,(int *)p是一个rvalue,它大致意味着一个只能出现在赋值右侧的表达式.

p另一方面是左值,这意味着它可以有效地出现在赋值的左侧.只有左值可以递增.