Си: вложенные циклы

Модератор: Модераторы разделов

Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Си: вложенные циклы

Сообщение olecya »

Рискую получить по шапке, я нисколько не призываю делать такие вещи, но возможности препроцессора бывают интересными:

Код: Выделить всё

#include <stdio.h>

#define fo(upto) for(int i = 0; i < (int)upto; ++i)

int main() {
        fo(2)
          fo(3)
            fo(4)
              printf("%d\n", i); 
}
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Мне почему то кажется, что это совсем не "для начинающих". Если только с целью отбить само желание связываться с си. :D
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

devilr писал(а):
14.12.2020 10:27
Мне почему то кажется, что это совсем не "для начинающих".
Тут согласна, это может и заслуживает внимания как сама возможность но будет ненужным для изучения. Но в принципе то сложного там ничего нет и очень понятна сама директива.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Я просто к тому, что каждый "современный" учитель желает дать ученику линейкой по рукам за использование макросов. Ну и за _inline (не всегда). А тут, прям такой прекрасный пример, из серии "вредные советы". :D
Не совсем понятно, что хотели сказать этим примером?
Последний раз редактировалось devilr 14.12.2020 12:09, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

devilr писал(а):
14.12.2020 11:41
А тут, прям такой прекрасный пример, из серии "вредные советы"
Вполне с вами согласна. Спасибо что поделились своим мнением

Я делюсь тем что считаю интересным а не избитым и будничным. Обычно я до недавнего времени
не выносила даже своего мнения, давая возможность и простор для обсуждения. Но вот в связи с тем что именно на нашем форуме пытаются часто додумать за меня и обличить во вредных намерениях я уже стараюсь занять правильную позицию что бы не оказаться грушей для битья. Мне крайне надоело оправдываться и уворачиваться.
Пожалуйста, оставляйте свои домыслы при себе или приписывайте их себе, не обсуждайте мои мотивы, лучше обсуждайте саму тему. Если она вам не интересна, просто пройдите мимо, помните ваше мнение это частное мнение, подумайте дважды прежде чем делиться негативом или на каждый негативный отзыв добавляйте своих два позитивных! Это наш климат, мы все им дышим.
Добавлено (12:03):
olecya писала:
14.12.2020 10:22
Рискую получить по шапке, я нисколько не призываю делать такие вещи,
Читайте мои комментарии, я их пишу вынужденно но они все равно почему то не работают...
Последний раз редактировалось olecya 14.12.2020 12:08, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

olecya писала:
14.12.2020 11:59
лучше обсуждайте саму тему
devilr писал(а):
14.12.2020 11:41
Не совсем понятно, что хотели сказать этим примером?
Возможно, что вы просто ошиблись разделом.
Я не хотел оскорбить или обидеть. Если так получилось - извините.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

devilr писал(а):
14.12.2020 12:08
Возможно, что вы просто ошиблись разделом.
Конечно возможно. Я не нашла идеально подходящего поэтому разместила здесь. Отдельные мои комментарии не воспринимайте на свой счет. Я стараюсь быть конструктивной и по мере объектывной, но я все еще человек с кучей "болячек"
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

Ну макросы конечно может и сокращают видимый код, но тут все равно нужно учитывать, что реально это не уменьшает программу, так как вставляется код в любом месте объявления(выполнения) макроса, который задан в макросе.
Если интересны примеры практического применения макросов, то не плохие примеры можно прочитать в книге Язык С в XXI веке. Мне эта книга понравилась.
Но тут явно вы напрашиваетесь получить по шапке ;)
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Си: вложенные циклы

Сообщение Bizdelnick »

ormorph писал(а):
14.12.2020 15:49
Если интересны примеры практического применения макросов, то не плохие примеры можно прочитать в книге Язык С в XXI веке
Макросы в XXI веке? :doh:
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

Bizdelnick писал:
14.12.2020 15:55
Макросы в XXI веке? :doh:
Не такого я точно не читал...
Просто в этой книге автор не мало приводит примеров использования макросов. А так весь упор на Си.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Bizdelnick писал:
14.12.2020 15:55
Макросы в XXI веке?
Ну, так смотря где. В embedded программировании их полно до сих пор. Как и самого си. :) Хотя, там и goto встречается...
P.S. Вот только там не совсем новички в разработке. Да и сами макросы не просто так используются. Как и goto.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Си: вложенные циклы

Сообщение Bizdelnick »

olecya, а вот Вам задачка: каков будет результат работы данной программы?

Код: Выделить всё

#include <stdio.h>

#define fo(upto) for(int i = 0; i < (int)upto; ++i)

int main() {
  int x = 1;

  fo(x++)
    printf("%d\n", i);

  return 0;
}
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

@Bizdelnick. Ну без проверки думаю переменная i вне макроса не определена поэтому и вложенные работают не смешивая каждый в своем эту переменную. Щас проверю
Добавлено (19:55):
Упс
Добавлено (19:58):
Не могу понять неужели переменной x присваевается не 2 а x++ тоже в виде макроса?
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

Код: Выделить всё

int x = 1;
for(int i = 0; i < (int)x++; ++i)
      printf("%d\n", i);
Как то так. Вечный цикл...
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

ormorph писал(а):
14.12.2020 15:49
примеры можно прочитать в книге Язык С в XXI веке.
Да, спасибо, у меня есть эта книга и я даже прочла примерно 4 часть.
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Си: вложенные циклы

Сообщение Bizdelnick »

ormorph писал(а):
14.12.2020 20:00
Вечный цикл...
Ну не вечный всё же. Остановится, когда x переполнится.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

Bizdelnick писал:
14.12.2020 20:15
Ну не вечный всё же. Остановится, когда x переполнится.
Ага само собой.
Хорошо хоть не асм и не дос, можно было бы попасть при переполнении в неизведанные участки памяти.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Не переполнится. Можно проверить. :)
Точнее переполнится и начнётся с нуля. Условий нет, чтобы куда то выйти.
P.S. Вспомнились 90-е: "наши новые процессоры X выполняют бесконечный цикл за 4 секунды" :D
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

devilr писал(а):
14.12.2020 20:25
Точнее переполнится и начнётся с нуля.
Хм, если я не ошибаюсь то должно выйти в минуса а потом само собой дойти и до нуля и т.д.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

ormorph писал(а):
14.12.2020 20:27
Хм, если я не ошибаюсь то должно выйти в минуса а потом само собой дойти и до нуля и т.д.
Ну да, переменная то знаковая, не заметил. :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Си: вложенные циклы

Сообщение Bizdelnick »

devilr писал(а):
14.12.2020 20:25
Условий нет, чтобы куда то выйти.
Как нет?

Код: Выделить всё

i < (int)x++;
В правой части будет INT_MIN, в левой — INT_MAX.

P. S. Нет, строго говоря, конечно, нельзя утверждать, что выйдет. Правильно говорить, что поведение не определено.
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5282
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение /dev/random »

Bizdelnick писал:
14.12.2020 20:15
Ну не вечный всё же. Остановится, когда x переполнится.
devilr писал(а):
14.12.2020 20:29
Ну да, переменная то знаковая, не заметил.
Между прочим, переполнение знаковой переменной - это UB. Например, оптимизатор имеет полное право (но не обязан) заметить, что проверка может сработать только после переполнения, и удалить её.
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Ну, можно немного ускорить.

Код: Выделить всё

#include <stdio.h>

#define fo(upto) for(int i = 0; i < (int)upto; ++i)

int main() {
    int x = 1;

    fo(x++)
    {
    if((i % 100000) == 0)
        printf("%d\n", i);
    }

    return 0;
}
Дойдёт до 2147400000 и выйдет в систему.
Добавлено (20:42):
/dev/random писал:
14.12.2020 20:40
Между прочим, переполнение знаковой переменной - это UB.
Может быть, но это си. Поэтому - как сложится. Исключений то нет. Как и перехватчика. :) А оптимизатор.... так его можно и не включать. В условиях задачи оптимизация не указана.
Последний раз редактировалось devilr 14.12.2020 20:44, всего редактировалось 1 раз.
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

Fixed. cat test.c:

Код: Выделить всё

#include <stdio.h>

#define fo(upto) for(int i = 0, j = upto; i < j; ++i)

int main() {
  int x = 1;

  fo(++x)
    printf("%d\n", i); 

  return 0;
}

Shell

make test
./test
0
1
Последний раз редактировалось olecya 14.12.2020 20:58, всего редактировалось 1 раз.
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

olecya писала:
14.12.2020 20:44
Fixed. cat test.c:
Это разные вещи, тут присваивание происходит только один раз, а это как раз j=2, а вот сравнение может происходить несколько раз...
Спасибо сказали:
Аватара пользователя
devilr
Сообщения: 3665
ОС: Mandriva => Gentoo (~amd64)
Контактная информация:

Re: Си: вложенные циклы

Сообщение devilr »

Откуда там функция foi взялась? :)
Мудрость приходит с возрастом.
Иногда возраст приходит один.
Эхо разума
Спасибо сказали:
Аватара пользователя
ormorph
Сообщения: 2600
ОС: Gentoo

Re: Си: вложенные циклы

Сообщение ormorph »

devilr писал(а):
14.12.2020 20:52
Откуда там функция foi взялась?
Очепятка не иначе, там должен был быть макрос fo.
Спасибо сказали:
Аватара пользователя
olecya
Сообщения: 900
ОС: debian, fedora (i3-wm)

Re: Си: вложенные циклы

Сообщение olecya »

devilr писал(а):
14.12.2020 20:52
Откуда там функция foi взялась?
инкримент и декримент, мусор

Код: Выделить всё

#define fod(upto) for(int i = upto; i > 0; --i)
исправила
Спасибо сказали:
MiK13
Сообщения: 1164
ОС: Linux Debian

Re: Си: вложенные циклы

Сообщение MiK13 »

olecya писала:
14.12.2020 10:22
возможности препроцессора бывают интересными:

Код: Выделить всё

#include <stdio.h>

#define fo(upto) for(int i = 0; i < (int)upto; ++i)

int main() {
        fo(2)
          fo(3)
            fo(4)
              printf("%d\n", i); 
}
Возможности препроцессора действительно могут быть интересными.
Я, когда после винды перешёл на Linux и, соответственно, сменил Pascal (в котором часто использовал комбнацию repeat ... until) на C, часто вставлял определения

Код: Выделить всё

#define repeat do {
#define until(CE) } while(!(CE))
Всё работало. Только скобки приходилось ставить.
Но вот вложенные #define сделать не получилось :( А хотел:
В программе несколько десятков разных флагов -- биты в определённой ячейке. Которые приходилось устанавливать, сбрасывать, изменять и проверять. Делал такие макросы:

Код: Выделить всё

#define FLAG1 1
#define FLAG1_t dd->flags&FLAg1
#define FLAG1_c dd->flags&=(~FLAg1)
#define FLAG1_s dd->flags|=FLAg1
#define FLAG1_i dd->flags^=FLAg1
А так как флагов было много, то и код получался длинным.
Вот и думал, может быть получится сделать один макрос, который будет расширять его в 4 строки. Но не смог.
Правда, можно было это сделать через функции:

Код: Выделить всё

void FLAG_t(uint32_t FLAG) { dd->flags&FLAG); }
void FLAG_c(uint32_t FLAG) { dd->flags&=(~FLAG)); }
void FLAG_s(uint32_t FLAG) { dd->flags|=FLAG); }
void FLAG_i(uint32_t FLAG) { dd->flags|^=FLAG); }
Но мне это казалось не эффективным
Спасибо сказали:
Аватара пользователя
Bizdelnick
Модератор
Сообщения: 20752
Статус: nulla salus bello
ОС: Debian GNU/Linux

Re: Си: вложенные циклы

Сообщение Bizdelnick »

MiK13 писал:
23.12.2020 18:38
мне это казалось не эффективным
А что, C99 с inline тогда ещё не было?
Пишите правильно:
в консоли
вку́пе (с чем-либо)
в общем
вообще
в течение (часа)
новичок
нюанс
по умолчанию
приемлемо
проблема
пробовать
трафик
Спасибо сказали:
Ответить