首先,我认为这是一个rvalue,但以下事实改变了我的想法。
我尝试了一个作为&(*&a)的表达式,它工作得很好,但是运算符&可以只使用lvalue,所以(*&a)是lvalue,为什么?
发布于 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)是一个值。
发布于 2019-08-28 11:59:29
此表达式&(&a)无效,无法工作。
根据C Stnadard
1一元&运算符的操作数应当是函数指示符,这是[]或一元*运算符、或lvalue的结果,后者指定的对象不是位字段,也不是寄存器存储类说明符声明的对象。
和
3一元&运算符产生其操作数的地址。如果操作数具有“类型”类型,则结果将键入“指向类型的指针”。如果操作数是一元*运算符的结果,则既不计算该运算符,也不计算&运算符,结果就好像两者都被省略了一样,但对运算符的约束仍然应用,且结果不是lvalue.。
因此,表达式&a的结果不是lvalue。因此,您可能不会将运算符&应用于像&&a这样的表达式。
这是一个演示程序。
#include <stdio.h>
int main(void)
{
int x = 10;
&( &x );
return 0;
}编译器gcc 8.3发出一个错误
prog.c: In function ‘main’:
prog.c:7:2: error: lvalue required as unary ‘&’ operand
&( &x );
^这个表达式*&a是有效的,结果是一个l值。
4一元*操作符表示间接。如果操作数指向函数,则结果是函数指示符;如果操作数指向对象,则结果是指定对象的值。如果操作数有“指向类型”的“指针”类型,则结果具有“类型”类型。如果已将无效值分配给指针,则不定义一元*运算符的行为。
请记住,括号不影响括起来的表达式是否为lvalue。
https://stackoverflow.com/questions/57691619
复制相似问题