ISO / IEC 9899:2011的6.3.2.1:2(即“ ISO C11标准”)说:
2除非它是
sizeof
运算符的操作数,否则一元&
运算符,++
运算符,--
运算符或该运算符的左操作数.
运算符或赋值运算符,不具有的左值 数组类型转换为存储在指定对象中的值 (并且不再是左值);这称为左值转换。如果 左值具有限定类型,值具有非限定版本 左值的类型;另外,如果左值具有原子类型, 该值具有左值类型的非原子版本; 否则,该值具有左值的类型。如果左值有一个 类型不完整且没有数组类型,其行为是 未定义。如果左值指定自动存储的对象 可以用寄存器存储类声明的持续时间 (从未使用过其地址),并且该对象未初始化(不是 用初始化器声明,并且没有赋值给它 使用之前执行),则行为是不确定的。
但是像指针本身一样,解引用的指针也不也是左值吗?例如。 int *ptr; ptr = malloc(…); *ptr = 1
那么为什么没有提到*
运算符-还是在这里让我感到困惑?
答案 0 :(得分:4)
您缺少第6.5.3.2p4节,该节讨论了间接操作符*
的语义:
一元
*
运算符表示间接。如果操作数指向一个函数,则结果为一个函数指示符;否则为0。 如果它指向一个 对象,结果是指定该对象的左值。 操作数的类型为“要键入的指针”,结果为 输入“类型”。如果已将无效值分配给 指针,一元的行为*
运算符未定义。
已定义运算符本身以产生左值。