考虑这段代码:
int x = 99;
int * p = &x;
*p = *p + 1;
为什么要这样做*p
在左侧和右侧=
运营商不同?
编译器如何知道使用左*p
成为对象x
和右边的*p
成为x
?
具体来说,如果编译器评估*p
成为x
,为什么*p
左侧的计算结果不等于 99,从而对文字创建了错误的赋值:99 = 99 + 1;
?
类似地,如果编译器评估*p
成为对象x
(假设这是左操作数=
运营商期望),为什么不*p
在右侧也评估该对象x
?
解引用运算符的结果*
is an lvalue。它引用一个可以分配的对象(而不仅仅是一个值)。
这意味着*p
是一个左值,表示对象p
明确指出x
.
当在表达式中使用左值时,例如*p + 1
or x + 1
,左值转换为值,不再是左值。这个转换确实not当左值是赋值运算符的左操作数时会发生。
该转换的详细信息请参见第 6.3.2.1p2 节C标准 https://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf:
除非它是操作数sizeof
运营商,_Alignof
运算符,一元&
运营商,++
运营商,--
运算符,或左操作数.
运算符或赋值
运算符,不具有数组类型的左值将转换为
存储在指定对象中的值(并且不再是左值);
这就是所谓的左值转换
所以表达*p = *p + 1
实际上等同于*p = 99 + 1
。同样适用于x = x + 1
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)