为什么++(*p)没有给出l值所需的错误?

Gee*_*eta 4 c arrays pointers lvalue

#include <stdio.h>
int main()
{
    int arr[] = {1, 2, 3, 4, 5};
    int *p = arr;
    ++*p;
    p += 2;
    printf("%d", *p);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为什么这段代码没有给出任何编译时错误,我的疑问被++*p评估为++(*p)并且*p将是常量值1,当我们做++(1)的不是l值时,为什么编译器没有给出错误?

alk*_*alk 11

*p 将是恒定价值[...]

不,它是一样的arr[0].

所以

++(*p);
Run Code Online (Sandbox Code Playgroud)

是相同的

++(p[0]);
Run Code Online (Sandbox Code Playgroud)

是相同的

++(arr[0]);
Run Code Online (Sandbox Code Playgroud)

这是一个完全有效的声明.