取消引用运算符返回什么? l值或r值

问题描述 投票:1回答:2

取消引用运算符返回什么?基于以下示例的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;
}
c
2个回答
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)产生左值。但是,表达式的值可以用作右值。


0
投票

一元*产生左值作为结果。非空指针p始终指向对象,因此* p是左值。例如:

int a[N];
int *p = a;
...
*p = 3;     // ok

虽然结果是左值,但操作数可以是右值,如下所示:

*(p + 1) = 4;    // ok

希望这能回答您的疑问。

© www.soinside.com 2019 - 2024. All rights reserved.