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

时间:2017-12-25 18:48:26

标签: c

取消引用运算符返回什么? 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;
}

2 个答案:

答案 0 :(得分:1)

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

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

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

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

希望这可以回答您的问题。

答案 1 :(得分:0)

根据1999 C标准,第6.3.2.1节,第1段以......开头

  

左值是具有对象类型或除void之外的不完整类型的表达式;

然后引用脚注53,其中说

  

名称''左值''最初来自作业表达式E1 = E2,其中左侧   操作数E1必须是(可修改的)左值。它可能更好地被视为代表一个   对象''定位器值''。在本国际标准中描述的有时称为“右值”   作为''表达的价值''。

     

左值的一个明显例子是对象的标识符。作为另一个例子,如果E是一元的   表达式是指向对象的指针,*E是一个左值,用于指定E指向的对象。

在n1548(2011年标准草案)中,同一段开头的内容略有不同,但含义基本相同;

  

这是   左值   是一个表达式(对象类型不是   空虚   )那可能   指定一个对象;

该段引用脚注64,其内容与1999 C标准的脚注53相同。

请记住,标准中的脚注不是规范性的 - 其目的是澄清和解释。

要回答原始问题,解除引用运算符(*p)会生成左值。但是,表达式的值可以用作右值。