lvalue требуется как ошибка операнда приращения - PullRequest
7 голосов
/ 03 июня 2011
#include <stdio.h>

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

Что не так с ++(-i)? Пожалуйста, уточните.

Ответы [ 4 ]

8 голосов
/ 03 июня 2011

-i создает временное значение, и вы не можете применить ++ к временному (генерируется в результате выражения rvalue).Предварительное увеличение ++ требует, чтобы его операндом было lvalue, -i не является lvalue, поэтому вы получите ошибку.

5 голосов
/ 03 июня 2011

Оператор ++ увеличивает переменную.(Или, если быть более точным, lvalue - что-то, что может появляться на l eft стороне выражения присваивания)

(-i) не являетсяпеременная, поэтому нет смысла увеличивать ее.

1 голос
/ 03 июня 2011

Вы не можете увеличить временное значение , у которого нет идентификатора .Вы должны хранить это в чем-то, чтобы увеличить его.Вы можете думать о l-значении как о чем-то, что может появиться в левой части выражения, но в конечном итоге вам нужно будет думать об этом с точки зрения того, что имеет идентичность, но не может быть перемещено (терминология C ++ 0x).Это означает, что у него есть идентичность, ссылка, ссылка на объект, то, что вы хотели бы сохранить.

(- i) не имеет НИКАКОЙ идентичности, поэтому нет ничего, что могло бы на него ссылаться.Не имея к чему ссылаться, невозможно что-то в нем хранить.Вы не можете ссылаться на (-i), поэтому вы не можете увеличивать его.

try i = -i + 1

#include <stdio.h>

int main()
{
   int i = 10;
   printf("%d\n", -i + 1); // <-- No Error Here
}
0 голосов
/ 03 июня 2011

Попробуйте вместо этого:

#include <stdio.h>

int main()
{
   int i = 10;
   printf("%d\n", (++i) * -1);
}
...