+我返回左值?

时间:2012-08-18 15:49:03

标签: c

下面的代码给出了C编译器中编译的错误

++(-i);
error: lvalue required as increment operand

这意味着-i返回rvalue。

代码

++(+i);

不要给出任何错误。为什么这样? this link说+我不会导致左值。

2 个答案:

答案 0 :(得分:5)

这是编译器中的一个小故障。在C语言中,表达式中的所有左值都会在应用任何运算符之前转换为rvalues,但sizeof&++--和左边的操作数除外 - .的手边和任务(见6.3.2 / 2)

换句话说,在C语言+i中必须产生一个rvalue,因为一元+应该产生一个rvalue,而是因为i之前转换为rvalue +甚至有机会做到这一点。

例如,对于包含值int i的{​​{1}}变量,表达式42完全等同于表达式+i+42的左值已丢失,并且在一元i的语义发挥作用之前会变为42

毋庸置疑,在这种情况下,一元+的结果不可能是左值。

答案 1 :(得分:0)

来自C99标准( 6.5.3.3一元算术运算符):

  

2一元+运算符的结果是其(提升的)操作数的值。整数提升在操作数上执行,结果具有提升类型。

     

3一元运算符的结果是其(提升的)操作数的否定。整数提升在操作数上执行,结果具有提升类型。

这个特定的上下文中,没有使用提升值+i的代码,因此我相信你的编译器认为它等同于i ,因此将其视为左值。或者可能只是它根本没有实现一元+。无论如何,这根本不是你应该做的事情,而其他编译器只会禁止它。

-i执行实际操作,因此其结果是暂时的。因此,你不能增加它,因为它不再是变量。

标准在 6.3.2.1其他操作数/左值,数组和函数指示符中清楚地表明了这一点:

  

2除非它是sizeof运算符的操作数,否则一元&运算符,++运算符, - 运算符或者左运算符。运算符或赋值运算符,没有数组类型的左值将转换为存储在指定对象中的值(并且不再是左值)。 [...]