取消引用运算符返回什么?基于以下示例的l值或r值,因为增量操作符正常工作。需要对此进行解释
// venukant
#include<stdio.h>
int main()
{
char arr[] = "gendafool";
char *p = arr;
++*p; // evaluated as ++(*p) but ++ requires a l-value
printf(" %c", *p); // prints h
return 0;
}
从1999 C标准,第6.3.2.1节,第1段开始......
左值是具有对象类型或除void之外的不完整类型的表达式;
然后提到脚注53,其中说
名称''左值''最初来自赋值表达式
E1 = E2
,其中左操作数E1
需要是(可修改的)左值。它可能更好地被视为表示对象的“定位器值”。有时被称为''rvalue'的东西在本国际标准中被描述为''表达的价值''。左值的一个明显示例是对象的标识符。作为另一个例子,如果
E
是一个指向对象的指针的一元表达式,则*E
是一个左值,用于指定E
指向的对象。
在n1548(2011年标准草案)中,同一段开头的内容略有不同,但含义基本相同;
左值是一个表达式(对象类型不是void)可能指定一个对象;
该段引用脚注64,其内容与1999 C标准的脚注53相同。
请记住,标准中的脚注不是规范性的 - 其目的是澄清和解释。
为了回答原始问题,解除引用运算符(*p
)产生左值。但是,表达式的值可以用作右值。
一元*产生左值作为结果。非空指针p始终指向对象,因此* p是左值。例如:
int a[N];
int *p = a;
...
*p = 3; // ok
虽然结果是左值,但操作数可以是右值,如下所示:
*(p + 1) = 4; // ok
希望这能回答您的疑问。