取消引用运算符返回什么? 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;
}
答案 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
)会生成左值。但是,表达式的值可以用作右值。