ISO C11标准中的左值
ISO/IEC 9899:2011的§6.3.2.1:2,即“ISO C11标准”,规定: 2一元ISO C11标准中的左值,c,language-lawyer,c11,lvalue,C,Language Lawyer,C11,Lvalue,ISO/IEC 9899:2011的§6.3.2.1:2,即“ISO C11标准”,规定: 2一元& 运算符、++运算符、--运算符或 运算符或赋值运算符,一个没有 数组类型转换为存储在指定对象中的值 (不再是左值);这称为左值转换。如果 左值具有限定类型,该值具有的非限定版本 左值的类型;此外,如果左值具有原子类型, 该值具有左值类型的非原子版本; 否则,该值的类型为左值。如果左值有一个 类型不完整且没有数组类型,行为为 未定义。如果左值指定自动存储的对象 可以使用register存储类声明的
&
运算符、++
运算符、--
运算符或
运算符或赋值运算符,一个没有
数组类型转换为存储在指定对象中的值
(不再是左值);这称为左值转换。如果
左值具有限定类型,该值具有的非限定版本
左值的类型;此外,如果左值具有原子类型,
该值具有左值类型的非原子版本;
否则,该值的类型为左值。如果左值有一个
类型不完整且没有数组类型,行为为
未定义。如果左值指定自动存储的对象
可以使用register存储类声明的持续时间
(从未获取过其地址),并且该对象未初始化(未初始化)
使用初始值设定项声明,但尚未对其进行赋值
在使用前执行),行为未定义
但是,解引用指针不也是左值吗,就像指针本身一样?例如,int*ptr;ptr=malloc(…)*ptr=1
那么为什么没有提到
*
操作符?或者我在这里混淆了什么?您缺少第6.5.3.2p4节,该节讨论了间接操作符*
的语义:
一元
*
运算符表示间接寻址。如果操作数指向函数,则结果为函数指示符如果它指向
对象,结果是指定对象的左值。如果
操作数的类型为“指向类型的指针”,结果为
键入“type”。如果已将无效值分配给
指针,一元数的行为
*
运算符未定义
运算符本身被定义为产生左值。您认为该段中应该是什么?在
*ptr
中,ptr
是左值。然后,根据6.3.2.1.2,转换为其值。然后,*
对其进行操作,为指向的对象生成一个左值。然后,*ptr
是赋值运算符的左操作数,因此它仍然是左值。然后赋值将1
分配给指向的对象。您引用的段落是关于左值的行为,而不是关于如何创建左值(后者是讨论*ptr
中的*
的地方