Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ISO C11标准中的左值_C_Language Lawyer_C11_Lvalue - Fatal编程技术网

ISO C11标准中的左值

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存储类声明的

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

2一元
&
运算符、
++
运算符、
--
运算符或
运算符或赋值运算符,一个没有 数组类型转换为存储在指定对象中的值 (不再是左值);这称为左值转换。如果 左值具有限定类型,该值具有的非限定版本 左值的类型;此外,如果左值具有原子类型, 该值具有左值类型的非原子版本; 否则,该值的类型为左值。如果左值有一个 类型不完整且没有数组类型,行为为 未定义。如果左值指定自动存储的对象 可以使用register存储类声明的持续时间 (从未获取过其地址),并且该对象未初始化(未初始化) 使用初始值设定项声明,但尚未对其进行赋值 在使用前执行),行为未定义

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


那么为什么没有提到
*
操作符?或者我在这里混淆了什么?

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

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


运算符本身被定义为产生左值。

您认为该段中应该是什么?在
*ptr
中,
ptr
是左值。然后,根据6.3.2.1.2,转换为其值。然后,
*
对其进行操作,为指向的对象生成一个左值。然后,
*ptr
是赋值运算符的左操作数,因此它仍然是左值。然后赋值将
1
分配给指向的对象。您引用的段落是关于左值的行为,而不是关于如何创建左值(后者是讨论
*ptr
中的
*
的地方