Ошибки Lvalue и указатели массива

Код выглядит так

#include<stdio.h>
#include<stdlib.h>
int main()
{
 int a[]={10,20,30,40,50};
 int j;
 for(j=0;j<5;j++)
 {
  printf("%d\n",*a);
  a++;
 }
 return 0;
}

Выход-

Error-: Lvalue требуется в качестве операнда приращения

Почему здесь происходит ошибка Lvalue ??


person Arpit king    schedule 03.06.2018    source источник
comment
Поскольку a++ не разрешено и в любом случае не имеет смысла, значит, ошибка правильная. Мой хрустальный шар сказал мне, что кто-то где-то сказал вам, что массивы и указатели в C являются синонимами. Если это так, то они солгали.   -  person WhozCraig    schedule 03.06.2018
comment
Но как это связано с ошибкой lvalue   -  person Arpit king    schedule 03.06.2018
comment
Что в конечном итоге делает пост-инкремент? Он сохраняет результат после оценки в a, и это так же незаконно, как a = ...   -  person WhozCraig    schedule 03.06.2018


Ответы (3)


Операнд ++ должен быть модифицируемым lvalue.

Из C11, глава §6.5.2.4

Операнд постфиксного оператора инкремента или декремента должен иметь атомарный, квалифицированный или неквалифицированный вещественный тип или тип указателя и должен быть модифицируемым lvalue.

Имя массива не является модифицируемым lvalue. Следовательно, его нельзя использовать в качестве операнда ++.

Добавить, цитируя C11, глава §6.3.2.1

[...] Изменяемое lvalue — это lvalue, которое не имеет типа массива, не имеет неполного типа, не имеет constqualified типа и, если это структура или объединение, не имеет иметь любой член (включая, рекурсивно, любой член или элемент всех содержащихся агрегатов или объединений) с constqualified типом.

person Sourav Ghosh    schedule 03.06.2018
comment
Сэр любые комментарии относительно Rvalues - person Arpit king; 03.06.2018
comment
@Arpitking хорошо, стандарт не определяет rvalue. Однако его можно считать эквивалентным значению выражения. - person Sourav Ghosh; 03.06.2018
comment
Стандарт упоминает в сноске: этот международный стандарт описывается как «значение выражения». Я также слышал, что любое значение, не являющееся lvalue, является rvalue. - person ad absurdum; 03.06.2018
comment
@DavidBowling, это то, что я имел в виду, говоря, что не определяет. Также я упомянул то же значение выражения в моем предыдущем комментарии. - person Sourav Ghosh; 03.06.2018
comment
@SouravGhosh - я просто указал, что Стандарт согласен с вами в ненормативной сноске. - person ad absurdum; 03.06.2018
comment
@DavidBowling :) Как ты думаешь, откуда еще я взял эти слова? Спасибо. - person Sourav Ghosh; 03.06.2018

Вы не можете увеличить имя массива. Если бы вы сделали следующее, это было бы прекрасно, поскольку вы работали бы с указателями:

int main()
{
 int a[]={10,20,30,40,50};
 int *b= a;
 int j;
 for(j=0;j<5;j++)
 {
  printf("%d\n",*b);
  b++;
 }
 return 0;
}
person Paul Ogilvie    schedule 03.06.2018

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

Код:

#include <stdio.h>

int main()
{
   int a[]={10,20,30,40,50};
 int j;
 for(j=0;j<5;j++)
 {
  printf("%d\n",*(a+j));
 }

 return 0;
}

Вывод:

введите здесь описание изображения

person Usman    schedule 03.06.2018