lvalue需要作为增量操作数错误

Wei*_*Wei 7 c c++ operators rvalue lvalue

#include <stdio.h>

int main()
{
   int i = 10;
   printf("%d\n", ++(-i)); // <-- Error Here
}
Run Code Online (Sandbox Code Playgroud)

有什么问题++(-i)?请澄清.

Pra*_*rav 8

-i生成一个临时的,你不能申请++临时(由于rvalue表达式而生成).预增量++要求其操作数为左值,-i不是左值,因此您得到错误.

  • @Xaade:您应该将`main`替换为`++( - A())`,目前程序中没有临时值.而且我从来没有声称你不能有一个临时的左值表达式(有很多方法可以做到),但我仍然觉得同样的人一遍又一遍,而且没有真正理解别人的问题只是因为他们可以编写一些似乎有用的类似(不等效)的代码.如果对术语有一些建设性的批评,我会好得多(我刚刚在Slaks回答大约10分钟前做过) (3认同)
  • @Nawaz:我不这么认为.你说答案是不能令人信服的,因为你可以用**成员**`operator ++`做类似的事情,这是一个完全不相关的问题.考虑`struct A {}; 运算符++(A&); ++ A();`哎呀...你不能在那里调用`operator ++`.你*改变了*问题(从内置的preincrement到成员preincrement)然后声明这个答案没有解决你的*修改*问题.在向你解释了区别之后,你无法接受你犯了错误.我们所有人都犯错误,这就是我们学习的方式. (2认同)
  • @Nawaz:您的确切评论是:*我不认为这是正确答案.您可以在临时应用++:ideone.com/cv9oI*.这并不是说您发现*临时*误导,但您认为答案是错误的,因为通过将问题转换为*调用成员函数*您可以在临时调用成员函数.同样,使用该代码甚至没有提示您正在讨论*temporary*和*rvalue*的区别,在这两种情况下,对象都是*temporaries*,表达式是*rvalue*表达式. (2认同)
  • @Nawaz:说真的,一个破碎的时钟每天给两次合适的时间.答案是(并且它的第一个版本)非常清楚.它使用`-i`表达式,它产生一个类型为`int`的*临时*和一个*rvalue*,它还表示`++`需要一个*左值*.虽然它可能更好 - 可以避免提及临时性,它可以指定`++`需要*左值,除非它被重写为类成员函数*,这超出了问题的范围.它可能会更好,但它绝不是错误的*. (2认同)

SLa*_*aks 5

++运营商增加的变量.(或者,更精确地说,一个左值,可以在出现-something 赋值表达式EFT侧)

(-i) 不是变量,所以增加它是没有意义的.