ISO C11标准中的左值

时间:2019-02-10 21:07:04

标签: c language-lawyer c11 lvalue

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

  

2除非它是sizeof运算符的操作数,否则一元&   运算符,++运算符,--运算符或该运算符的左操作数   .运算符或赋值运算符,不具有的左值   数组类型转换为存储在指定对象中的值   (并且不再是左值);这称为左值转换。如果   左值具有限定类型,值具有非限定版本   左值的类型;另外,如果左值具有原子类型,   该值具有左值类型的非原子版本;   否则,该值具有左值的类型。如果左值有一个   类型不完整且没有数组类型,其行为是   未定义。如果左值指定自动存储的对象   可以用寄存器存储类声明的持续时间   (从未使用过其地址),并且该对象未初始化(不是   用初始化器声明,并且没有赋值给它   使用之前执行),则行为是不确定的。

但是像指针本身一样,解引用的指针也不也是左值吗?例如。 int *ptr; ptr = malloc(…); *ptr = 1

那么为什么没有提到*运算符-还是在这里让我感到困惑?

1 个答案:

答案 0 :(得分:4)

您缺少第6.5.3.2p4节,该节讨论了间接操作符*的语义:

  

一元   *运算符表示间接。如果操作数指向一个函数,则结果为一个函数指示符;否则为0。 如果它指向一个   对象,结果是指定该对象的左值。   操作数的类型为“要键入的指针”,结果为   输入“类型”。如果已将无效值分配给   指针,一元的行为   *运算符未定义。

已定义运算符本身以产生左值。