Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/79: Рейтинг темы: голосов - 79, средняя оценка - 4.75
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
1

Ошибка lvalue required as increment operand

11.11.2010, 13:40. Показов 16181. Ответов 4
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день возник вопрос почему вылетает ошибка lvalue required as increment operand в строке 5
C
1
2
3
4
char ch;
char *expr[] = {"my", "w9rd", "the"};
 
ch = (*++expr)[1]; // 5
Сделано по аналогии с книги по Си Кернигана и Ричи вот оригинальная программа:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
int getline(char *line, int max);
 
/* find: печать строк образцами из 1-го аргумента */
main(int argc, char *argv[])
{
char line[MAXLINE];
long lineno = 0;
int c, except = 0, number = 0, found = 0;
while (—argc > 0 && (*++argv)[0] == '-')
    while (c = *++argv[0])
        switch (c) {
        case 'x1': -
           except = 1;
           break;
        case ' a' :
           number = 1;
           break;
        default:
           printf( "find: неверный параметр %с\п", с);
           argc = 0;
           found = -1;
           break;
        }
    if (argc != 1)
        рrintf("Используйте: find -x -n образец\n");
    else
         while (getline(line, MAXLINE) > 0) {
            lineno++;
            if ((strstr(line, *argv) != NULL) != except) {
               if (number)
                  printf("%ld:", lineno);
               printf("%s", line);
               ound++;
   return found;
}
Это опечатка в книги или написано по старому стандарту? Прошу также объяснить суть ошибки

2. еще натыкнулся на конструкции которая вызывает ту же ошибку
C
1
2
int i;
i = i + ++i--;
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2010, 13:40
Ответы с готовыми решениями:

Ошибка: lvalue required as left operand of assignment
#include &lt;stdio.h&gt; int main () { float a1, a2, a3, b; printf(&quot;\n input 3 float a1, a2, a3 \n&quot;...

Обмен адресами через указатели и ошибка "Lvalue required as left operand of assignment"
#include &lt;stdio.h&gt; #include &lt;cstdlib&gt; #include &lt;locale&gt; #define LEN 5 double arr = {1.1,...

Ошибка: (19,22): Lvalue required
Пожалуйста помогите найти ошибку! Ошибка: (19,22):Lvalue required Задача несложная, но не как не...

Ошибка Lvalue required
Пожалуйста помогите исправить ошибку Lvalue required в этой строке: str2=+(s); #include...

4
5231 / 3204 / 362
Регистрация: 12.12.2009
Сообщений: 8,116
Записей в блоге: 2
11.11.2010, 15:02 2
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

попробуйте так
C
1
ch = (*(expr+1))[1];
2) это undefined behavior, почитайте. (там правда в контексте языка С++, но думаю по данному вопросу особой разницы нет)
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
11.11.2010, 21:57  [ТС] 3
Цитата Сообщение от Kastaneda Посмотреть сообщение
попробуйте так
C
1
ch = (*(expr+1))[1];
2) это undefined behavior, почитайте. (там правда в контексте языка С++, но думаю по данному вопросу особой разницы нет)
Ваш пример работает, но не могли бы вы более докладно объяснить в чем причина

прочитал я про undefined behavior в моем примере
C
1
ch = (*++expr)[1];
и так точка следования у нас одна ";" объект expr изменяется только раз ++expr объект ch тоже раз при присваивании то есть изменение объектов expr и ch выполняется только по разу до точки следования, и тут начинается самое интересное... код
C
1
ch = (*(++expr))[1];
вызывает ту же ошибку! ну почему? ведь казалось бы порядок вычисления строго задан с помощью скобок и нет перекрытия точки следования?

Добавлено через 46 минут
Цитата Сообщение от Kastaneda Посмотреть сообщение

2) это undefined behavior, почитайте. (там правда в контексте языка С++, но думаю по данному вопросу особой разницы нет)
Все разобрался это не undefined behavior, хвала книге K&R expr в моем случае это имя массива указателей на чар, который нельзя инкрементировать(изменять) и который в частном случае может быть указателем на массив указателей. но его же изменять нельзя что я пытался сделать
C
1
(++expr)
Данная проблема решается объявлением указателя на указатель:
C
1
2
3
4
5
6
 char *expr[] = {"my", "w9rd", "the"};
      char **p_char;
 
      p_char = expr;
      ch = (*++p_char)[2];
      std::cout << ch;
все впорядке выводится символ 'r'
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
11.11.2010, 22:34 4
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Цитата Сообщение от norge_goth Посмотреть сообщение
прочитал я про undefined behavior в моем примере
C
1
ch = (*++expr)[1];
и так точка следования у нас одна ";"
Я думаю Кastaneda имел ввиду этот код:
Цитата Сообщение от norge_goth Посмотреть сообщение
C
1
2
int i;
i = i + ++i--;
1
62 / 62 / 13
Регистрация: 27.01.2009
Сообщений: 279
11.11.2010, 22:44  [ТС] 5
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
Я думаю Кastaneda имел ввиду этот код:
а да виноват
не про то думал... хотя с undefined/unspecified behavior разобрался за что и сказал ему спасибо
0
11.11.2010, 22:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
11.11.2010, 22:44
Помогаю со студенческими работами здесь

Исправить код: ошибка компиляции lvalue required
#include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;conio.h&gt; main (){ int n,m,t ; float...

Как обойти ошибку "lvalue required as increment operand" в большом старом коде
Мои познания в С неглубоки, и нужна консультация более опытного профи. Ошибка появилась при...

Ошибка: lvalue required as left operand of assignment
b += l * b; выдает ошибку в этой строке: lvalue required as left operand of assignment

Ошибка: lvalue required as left operand of assignment
char is_lucky( int n ) { int left = 0, right = 0; for (int i = 0 ; i &lt; 6 ; n /= 10) ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru