首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >(*&a)是lvalue还是rvalue?

(*&a)是lvalue还是rvalue?
EN

Stack Overflow用户
提问于 2019-08-28 11:42:40
回答 2查看 169关注 0票数 1

首先,我认为这是一个rvalue,但以下事实改变了我的想法。

我尝试了一个作为&(*&a)的表达式,它工作得很好,但是运算符&可以只使用lvalue,所以(*&a)lvalue,为什么?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-28 12:24:19

按照C 2018 6.5.3.2 4(讨论unary *操作符),一元*的结果是一个值:

…如果操作数指向一个函数,则结果是一个函数指示符;如果它指向一个对象,则结果是一个指定该对象的值。…

这告诉我们,*&a是一个值。但是,问题中询问的表达式是(*&a),因此我们必须考虑括号的影响。

6.3.2.1 2(讨论自动转换)似乎告诉我们,(*&a)被转换为*&a中的值,而不是lvalue:

除非是sizeof of运算符、一元&运算符、++运算符、--运算符、或.运算符或赋值运算符的左操作数,否则不具有数组类型的lvalue将转换为存储在指定对象中的值(而不再是lvalue);这称为lvalue转换。

但是,6.5.1 5(讨论括号内的表达式)与此相矛盾:

带括号的表达式是主表达式。其类型和值与无括号表达式的类型和值相同。如果不带括号的表达式分别是lvalue、函数指示符或空表达式,则为lvalue、函数指示符或空表达式。

这是C标准中的一个缺陷;6.5.1 5和6.3.2.1 2相互矛盾。让我们理解的是,6.5.1 5,特别是关于括号大小的表达式,优先于更一般的6.3.2.1 2,这是所有C实现的行为方式。

因此,(*&a)是一个值。

票数 1
EN

Stack Overflow用户

发布于 2019-08-28 11:59:29

此表达式&(&a)无效,无法工作。

根据C Stnadard

1一元&运算符的操作数应当是函数指示符,这是[]或一元*运算符、或lvalue的结果,后者指定的对象不是位字段,也不是寄存器存储类说明符声明的对象。

3一元&运算符产生其操作数的地址。如果操作数具有“类型”类型,则结果将键入“指向类型的指针”。如果操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两者都被省略了一样,但对运算符的约束仍然应用,且结果不是lvalue.

因此,表达式&a的结果不是lvalue。因此,您可能不会将运算符&应用于像&&a这样的表达式。

这是一个演示程序。

代码语言:javascript
复制
#include <stdio.h>

int main(void) 
{
    int x = 10;
    &( &x );

    return 0;
}

编译器gcc 8.3发出一个错误

代码语言:javascript
复制
prog.c: In function ‘main’:
prog.c:7:2: error: lvalue required as unary ‘&’ operand
  &( &x );
  ^

这个表达式*&a是有效的,结果是一个l值。

4一元*操作符表示间接。如果操作数指向函数,则结果是函数指示符;如果操作数指向对象,则结果是指定对象的值。如果操作数有“指向类型”的“指针”类型,则结果具有“类型”类型。如果已将无效值分配给指针,则不定义一元*运算符的行为。

请记住,括号不影响括起来的表达式是否为lvalue。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57691619

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档