为什么左值在某些地方转换为值而不是其他地方?

for*_*izi 0 c operators

考虑这段代码:

int x = 99;
int * p = &x;
*p = *p + 1;
Run Code Online (Sandbox Code Playgroud)

为什么*p运算符的左侧和右侧=不同?

编译器如何知道使用左侧*p作为对象x,右侧*p作为 的值x

具体来说,如果编译器求*p值为 的值x,为什么*p左侧的 不求值为 99,从而对文字创建错误的赋值:99 = 99 + 1;
类似地,如果编译器求*p值为对象x(假设这是运算符的左操作数=所期望的),为什么*p右侧的值不也求值为对象x

dbu*_*ush 7

解引用运算符的结果*左值。它引用一个可以分配的对象(而不仅仅是一个值)。

这意味着是一个左值,表示指向的*p对象,特别是。px

当左值用于表达式(例如*p + 1or )时x + 1,左值将转换为值并且不再是左值。当左值是赋值运算符的左操作数时,不会发生转换。

C 标准的 6.3.2.1p2 节详细介绍了此转换:

除非它是运算符sizeof_Alignof 运算符、一元&运算符、运算++符、运算-- 符、运算符的左操作数或.赋值运算符的操作数,否则不具有数组类型的左值将转换为存储在指定对象(并且不再是左值);这称为左值转换

因此该表达式*p = *p + 1实际上与 相同*p = 99 + 1。也同样如此x = x + 1