Левое значение? Правильное значение?
Если вы говорите о lvalues и rvalues, то свойство быть lvalue или rvalue применяется к результату выражения, что означает, что у вас есть рассмотреть результаты --i
и i--
. А в языке C оба --i
и i--
являются rvalue. Итак, ваш вопрос основан на неверной предпосылке в области языка C. --i
не является lvalue в C. Я не знаю, что вы пытаетесь сделать, ссылаясь на стандарт C99, поскольку в нем четко указано, что ни одно из них не является lvalue. Кроме того, неясно, что вы подразумеваете под i--
, возвращающим void
. Нет, встроенный постфикс --
никогда не возвращает void
.
Различие lvalue и rvalue в случае --i
и i--
существует только в C++.
В любом случае, если вы смотрите на простые операторы выражений --i;
и i--;
, вы не используете результаты этих выражений. Вы отбрасываете их. Единственная причина использовать автономные --i
и i--
— это их побочные эффекты (уменьшение i
). Но поскольку их побочные эффекты идентичны, вполне ожидаемо, что сгенерированный код будет таким же.
Если вы хотите увидеть разницу между выражениями --i
и i--
, вы должны использовать их результаты. Например
int a = --i;
int b = i--;
будет генерировать другой код для каждой инициализации.
Однако этот пример не имеет ничего общего с ценностью или ценностью их результатов. Если вы хотите увидеть разницу с той стороны (которая существует только в C++, как я сказал выше), вы можете попробовать это
int *a = &--i;
int *b = &i--;
Первая инициализация будет компилироваться в C++ (поскольку результатом является lvalue), а вторая не будет компилироваться (поскольку результатом является rvalue, и вы не можете применить встроенный унарный &
к rvalue).
Обоснование этой спецификации довольно очевидно. Поскольку --i
оценивается как новое значение i
, вполне возможно заставить этот оператор возвращать ссылку на само i
в качестве своего результата (а язык C++, в отличие от C, предпочитает возвращать lvalues при любой возможности). Между тем, i--
требуется для возврата старого значения i
. Поскольку к тому времени, когда мы приступим к анализу результата oh i--
, само i
, скорее всего, будет содержать новое значение, мы не можем вернуть ссылку на i
. Мы должны сохранить (или воссоздать) старое значение i
в каком-то вспомогательном временном месте и вернуть его как результат i--
. Это временное значение является просто значением, а не объектом. Ему не нужно находиться в памяти, поэтому он не может быть lvalue.
person
AnT
schedule
21.12.2012
i--= 5
не двусмысленно? Это может означатьi-- = 5
илиi- -= 5
- person ApproachingDarknessFish   schedule 21.12.2012i- -= 5
, как объяснить эту частьi-
? - person jaurung   schedule 21.12.2012i--=5
он будет жеватьi
в качестве первого токена. И затем, поскольку в C и C++ есть такой допустимый токен, как--
, требуется прожевать весь--
. Не разрешается останавливаться после первого-
. По этой причине он будет интерпретироватьi--=5
какi -- = 5
, а не какi - -= 5
. - person AnT   schedule 21.12.2012