在ISO C11标准的左值

问题描述 投票:3回答:1

§ISO / IEC的6.3.2.1:2 9899:2011,即“ISO C11标准”,说:

2除了当它是sizeof操作者的操作数,一元&运算符,++运算符,--操作者,或.操作员或赋值运算符,不具有阵列型左值的左操作数被转换为值存储在指定对象(并且不再左值);这就是所谓的左值转换。如果左值有限定类型,该值具有左值的类型的非限定版本;附加地,如果左值具有原子类型,该值具有左值的类型的非原子版本;否则,该值具有左值的类型。如果左值有一个不完整的类型,没有数组类型,其行为是不确定的。如果左值指定,可能已被宣布与寄存器存储自动存储时间的对象(从来没有考虑它的地址),而该对象未初始化(不是一个初始化声明并没有分配到已在使用前进行),该行为是不确定的。

但不是取消引用指针也是一个左值,就像指针本身?例如。 int *ptr; ptr = malloc(…); *ptr = 1

那么,为什么*运营商没有提及 - 或者我在这里混淆的东西吗?

c language-lawyer c11 lvalue
1个回答
4
投票

你错过了部分6.5.3.2p4,其中讨论间接运算符*的语义:

一元运算符*表示间接。如果操作数指向一个函数,结果是一个功能标志;如果它指向一个物体,其结果是一个左值指定的对象。如果操作数的类型“指针输入”,结果类型为“类型”。如果无效值已被分配给指针,一元*操作的行为是不确定的。

操作本身被定义为产生一个左值。

© www.soinside.com 2019 - 2024. All rights reserved.