Почему ++ я ++ дает "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-значение.