Почему ++ я ++ дает "L-значение требуемой ошибки" в C?
В приведенном ниже коде:
main()
{
int i = 5;
printf("%d", ++i++);
}
Эта программа дает ошибку "L-Value required"
.
Может кто-нибудь сказать мне : Почему ошибка компиляции?
Ответы
Ответ 1
Поскольку операторы постфикса имеют более высокий приоритет, чем префиксные операторы, поэтому выражение ++i++
эквивалентно ++(i++)
, что эквивалентно ++( i + 1)
. Компилятор дает ошибку l-value, потому что вы применяете ++
к выражению (i++)
, которое не является изменяемым значением lvalue, поэтому не допустимое выражение в c в соответствии с определением оператора инкремента.
Согласно книге Денниса М. Ричи: "Язык программирования C" :
2.8 Операторы приращения и уменьшения
(стр. 44)
Операторы приращения и уменьшения могут применяться только к переменным; выражение типа (i + j)++
является незаконным. Операнд должен быть modifiable lvalue
арифметики или типа указателя.
Связанный: Интересная ошибка, о которой может быть рассказана в gcc 4.4.5, заключается в компиляции выражения j = ++(i | i);
, которое должно приводить к ошибке l-value. Читайте: j = ++(i | i);
и j = ++(i & i);
должна быть ошибка: lvalue?
Кроме того, изменение одной и той же переменной более одного раза в выражении без промежуточной точки последовательности вызывает undefined поведение в c и С++, Чтобы понять, прочитайте Объясните поведение undefined в i = i++ + ++i;
.
Ответ 2
Как правило, вы не должны этого делать, поскольку это заслоняет код.
Причина, по которой вы получаете ошибку, состоит в том, что пост-инкремент имеет прецедент и, следовательно, возвращает значение r, т.е. ++i++ == ++(i++)
, которое не может быть увеличено.
Однако вы можете использовать (++i)++
, поскольку предварительный приращение (по-видимому, на VS2010) возвращает i
сам, l-значение, которое может быть добавлено после.
Ответ 3
эта строка:
printf("%d",++i++)
== >
printf("%d",(++i)++)
И
== >
printf("%d",(++i)); &(++i)++ ==> (++i) = (++i) +1;
Посмотрите, как вы используете (++ i) в качестве значения слева.
Ответ 4
Это потому, что вы делаете приращение к константе.
В вашем случае
++i => 6
++i++ => 6++ //this is not possible. Gives lvalue error
++i+10 => 6+10 => 16 //this is possible
Так что делать ++ я ++ нехорошо. Поступать приращение/декремент, pre increment/decment возможно только при переменных. Во время выполнения ваш оператор станет константой, поэтому здесь выдается ошибка lvalue.
++i => 6 => i=6;
i++ => 6 => i=7;
printf("%d",i); //7
Ответ 5
Выражение ++i++
оценивается как ++(i++)
, которое является незаконным в C, поскольку приращение postfix возвращает значение, а префикс, увеличивающий его значение, не имеет смысла.
То, что у вас есть, несколько эквивалентно: ++(5)
, что явно незаконно, поскольку вы можете применять приращение префикса к чему-то, что не l-значение.