Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Непонятки со стандартом (язык С)  (Прочитано 7430 раз)
0 Пользователей и 1 Гость смотрят эту тему.
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« : 20-01-2014 13:10 » 

Что делает выражение  *buf++; (char * buf;).
Разыменование и инкремент имеют одинаковый приоритет.
Почему срабатывает сначала инкремент, а потом разыменование.
Записан
Sla
Модератор

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-01-2014 13:29 » 

а зачем нужна ;
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #2 : 20-01-2014 13:40 » 

а зачем нужна ;
Переносил из кода Улыбаюсь.
Оригинальный фрагмент можно свести к int z=*buf++;
Записан
Dale
Блюзмен
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 20-01-2014 19:45 » 

Разыменование и инкремент имеют одинаковый приоритет.

Поясните, что значит "срабатывает"? По стандарту (во всяком случае в C99) у постфиксного и префиксного инкрементов приоритет разный. У постфиксного выше, у префиксного такой же, как и у разыменования (см. раздел 6.5 Expressions).

Можно подробнее? Действительно ли постфиксный инкремент, который по определению должен выполняться после вычисления выражения, в Вашем случае выполняется до него?

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

Всего лишь неделя кодирования с последующей неделей отладки могут сэкономить целый час, потраченный на планирование программы. - Дж. Коплин.

Ходить по воде и разрабатывать программное обеспечение по спецификациям очень просто, когда и то, и другое заморожено. - Edward V. Berard

Любые проблемы в информатике решаются добавлением еще одного уровня косвенности – кроме, разумеется, проблемы переизбытка уровней косвенности. — Дэвид Уилер.
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #4 : 20-01-2014 21:26 » 

Собственно небольшой пример
Код: (C)
#include <stdio.h>

int main() {
  int le[]={1,3,5,7,9,11,13,15,17,19};
  for(int i=0; i<10; i++) {
    printf("%d ", le[i]);
  }
  printf("\n");
  int *buf = le;
  printf("*buf = %d\n", *buf);
  int z = *buf++;
  for(int i=0; i<10; i++) {
    printf("%d ", le[i]);
  }
  printf("\n");
  printf("*buf = %d\n", *buf);
  printf("z = %d\n", z);
 
  return 0;
}
$ g++ lemmonrus.cpp -o lemmonrus
$ ./lemmonrus
1 3 5 7 9 11 13 15 17 19
*buf = 1
1 3 5 7 9 11 13 15 17 19
*buf = 3
z = 1
Собственно ожидаемый ответ.
« Последнее редактирование: 20-01-2014 21:28 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #5 : 20-01-2014 22:44 » 

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

Код: (C)
#include <stdio.h>

int main() {

  int a[] = {1, 10, 100};
  int *buf = a;

  printf("Pre-increment of pointer: %i\n",
    (buf += 1, *buf)
  );
 
  printf("Post-increment of pointer: %i\n",
    (buf += 1, *(buf - 1))
  );

  printf("Pre-increment of value: %i\n",
    (*buf += 1, *buf)
  );

  printf("Post-increment of value: %i\n",
    (*buf += 1, *buf - 1)
  );

  return 0;

}

Общим результатом всегда является выражение после запятой - последнее в перечне.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #6 : 21-01-2014 10:07 » 

Разыменование и инкремент имеют одинаковый приоритет.

Поясните, что значит "срабатывает"? По стандарту (во всяком случае в C99) у постфиксного и префиксного инкрементов приоритет разный. У постфиксного выше, у префиксного такой же, как и у разыменования (см. раздел 6.5 Expressions).

Можно подробнее? Действительно ли постфиксный инкремент, который по определению должен выполняться после вычисления выражения, в Вашем случае выполняется до него?

Сделайте, пожалуйста, контрольную печать переменной buf, а также результата ее разыменования до и после вычисления.
Вопрос снят, у постфиксного действительно приоритет выше.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #7 : 22-01-2014 05:36 » 

Простое и действенное правило: сомневаешься — меняй приоритет — используй скобки.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
LemmonRus
Помогающий

ru
Offline Offline
В правильно заданном вопросе 90% ответа.


« Ответ #8 : 22-01-2014 13:24 » new

Простое и действенное правило: сомневаешься — меняй приоритет — используй скобки.
Я так и делаю. Улыбаюсь Но вот при разборе древних исходников очень хочется пообщаться с авторами.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines