是* p是左值还是左值

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是* p是左值还是左值相关的知识,希望对你有一定的参考价值。

在下面的代码中,*a是左值还是左值?

#include <stdio.h>

void main()
{
    int b=2;
    int *a=NULL;
    a=&b;
    *a=3;
    printf("%d",*a);

}
答案

http://en.wikipedia.org/wiki/Value_%28computer_science%29暴露:

Lvalues具有可由运行程序以编程方式访问的存储器地址(例如,通过诸如C / C ++中的“&”之类的操作符地址),这意味着它们是对某个存储器位置的变量或解引用引用。 Rvalues可以是左值(见下文)或非左值

所以,* a是左值

另一答案

它是一个l值,可以在r值的上下文中使用。见例子;

int i, j, *p, *q;
p = &i;
q = &j;

*p = 1; // *p is l-value
*q = 2; // *q is l-value

*p = *q // *q is r-value

正如Charles Bailey在他的评论中所指出的: - 子表达式*q仍然是l值,它经历了l值到r值的转换,因为它用于需要r值的上下文中。


现在有人可能会认为为什么*q仍然是l值? 因为通过r值的定义,r值是一个临时值,不会超出使用它的表达式。 在这种情况下,*q的值仍然超出表达式*p = *q


注意:

“*”运算符 - deference / indirection运算符 - 对指针变量进行操作,并返回一个等于指针地址值的l值。

另一答案

根据K&R第2版p197§A5:

...左值是一个表达对象的表达式...例如,如果E是指针类型的表达式,则*E是一个左值表达式,指向E指向的对象。

此外,Scott Meyers在其着作“现代C ++,引言 - 术语和约定”一书中提出了另一种更简单的方法来确定左值/右值:

确定表达式是否为左值的有用启发式方法是询问您是否可以获取其地址。如果可以,通常是。如果你不能,它通常是一个右值。此启发式的一个很好的特性是它可以帮助您记住表达式的类型与表达式是左值还是右值无关。

因此,当*p表达出现在左侧时,它是一个lvalue,右侧是rvalue

以上是关于是* p是左值还是左值的主要内容,如果未能解决你的问题,请参考以下文章

(*&) 是左值还是 r 值?

Widget&& rhs 是左值还是右值引用[重复]

什么是左值和右值

错误:需要左值作为赋值的左操作数,我收到此错误啥是左值和右值以及如何删除此错误

C++:神一样的左值

C++(E0158 表达式必须是左值或函数指示符)和(错误 C2102 '&' 需要左值)