是* p是左值还是左值

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

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

#include <stdio.h>

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

}
c lvalue rvalue
3个回答
1
投票

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

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

所以,* a是左值


1
投票

它是一个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值。


0
投票

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

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

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

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

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

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