2013-07-03 1 views
2

привет Я изучаю основы языка программирования C, в последнее время я изучал около пост и до увеличения/уменьшения операторов, а также о Левое и правое, следующая программа выдает ошибку, Требуется lvalue, согласно мне, он должен дать значение , Может кто-нибудь объяснить, почему?Confused с предварительной и пост приращений оператора

int main(){ 
    int x = 8, y; 
    y = --x--; 
    printf("y=%d",y); 
    return 0; 
} 

Пожалуйста, объясните, почему это так?

+0

Опишите свои комментарии, если вы проголосуете за это, это кажется очень сложным для меня. –

+3

Все это дает вам неопределенное поведение. 'x' изменяется несколько раз без промежуточной точки. –

+0

@AlokSave, не могли бы вы объяснить более подробно ..... –

ответ

5

Хорошо, давайте посмотрим, что происходит в --x--. Сначала выполняется пост-декремент: --(x--). (x--) = 7. После этого результата этой операции помещается в исходную структуру: --7 - не имеет смысла, - таким образом, вы получите lvalue required ошибка

+1

Не имеет ли постфикс приоритет над префиксом? – llakais

+1

Ты прав. забыл об этом :(Будет ли обновляться ответ –

+0

Хаха круто. Единственная причина, по которой я упоминал об этом, - в C++ (я знаю, что этот вопрос отмечен C), я думаю, что '(++ x) ++' действительно будет работать, поскольку в Операторы префикса C++ возвращают lvalues. – llakais

4

Заявление y = --x--; даст вам следующее сообщение об ошибке на компиляции в C. lvalue required. Это связано с тем, что оператор пост декремента - возвращает rvalue после работы с переменной x. Таким образом, для выполнения оператора пред декремента нет значения lvalue - впоследствии.

Но это один из пунктов, где C и C++ отличается. В C следующий оператор также даст вам ту же ошибку lvalue required.

y = (--x)--; 

Но C++ заявление y = (--x)--; будет компилироваться, а значение y является 7. Поскольку в отличие от C, C++ возвращает lvalue после выполнения оператора пред декремента переменной x.

+0

+1 И, GCC говорит: 'error: expression не присваивается' с подчеркнутым' x - '. –

0

В порядке операций указано, что операторы постфикса имеют приоритет над операторами префикса. Оператор postfix возвращает текущее значение (rvalue) операнда и затем уменьшает операнд. Затем будет применен оператор декремента префикса ... но операторы декремента/приращения нуждаются в lvalue-операндах, поскольку по определению модифицируют их операнды. Итак, как компилятор говорит, требуется lvalue.

2

L Value - левый операнд оператора присваивания, который должен ссылаться на местоположение памяти. Как поясняется @Pavel, ваше значение Lvalue становится значением, а не объектом, поэтому вы получаете ошибку.

--x означает x = x-1, но в вашем случае это становится --7, которая будет эквивалентна 7 =7-1, которая, безусловно, не является действительным выражением.

Кроме этого более одной операции с одной и той же переменной без sequence point между ними, результаты undefined behaviour.

0

Вы не должны использовать его за раз, потому что вы не поймете поведение компилятора. Итак, вам нужно вести свой код, чтобы они заставили делать то, что вам нравится.

Теперь пришла к вам. Если вы хотите уменьшить значение на единицу, вы можете использовать a-- или --a. Они будут делать то же самое.Если a = 5 и вы используете b=a--, вы получите b = 5 and a = 4, где, если вы используете b=--a, вы получите b = 4 and a = 4 в --a, значение присваивается немедленно, а значение a-- будет присвоено после завершения инструкции. Надеюсь, вы понятны.

L Значение, требуемое для отображения ошибки, если оно не находит подходящей переменной, где оно может быть назначено.

Смежные вопросы