Ох уж этот синтаксис!
- Войдите на сайт для отправки комментариев
Пнд, 23/09/2019 - 11:24
Всем привет!
Подскажите, пожалуйста, полиглоты языка Си, как трактовать такую запись:
if (!(++i%16)) { }
Что прописано в условии? Такую запись встретил к удивлению впервые. Гуглинг как то результатов не дал.
Если кто знает ресурсы по синтаксису такого рода, напишите, пожалуйста, ссылочку.
Заранее спасибо!
http://www.c-cpp.ru/books/uvelichenie-i-umenshenie
увеличить i на единицу (++), потом взять остаток от деления i на 16 (%16), и если результат не равен 0 (!) то выполнить апираторы в фигурных скопках. По русски:
Привыкай. Си позволяет написать такие условия, которые, даже у опытных индусских писателей кода руками, ничего кроме
вызвать немогут.
увеличить i на единицу (++), потом взять остаток от деления i на 16 (%16), и если результат не равен 0 (!) то выполнить апираторы в фигурных скопках. По русски:
всю интригу кода упорол )))
Большое спасибо!
Только
if
((i & 0x0F) == 0), а
то мужик сейчас призадумается.)Только
if
((i & 0x0F) == 0), а
то мужик сейчас призадумается.)Точно. каждый шешнаццатый раз исполнить нечто. Спасибо, это я невнимателен.
Это что. Давеча запускаю, до этого места доходит и зависает...
сhar data[4];
for (uint8_t i = 0; sizeof(data); i++)
data = ' ';
3 раза всё просмотрел, пока увидел.)
Это что. Давеча запускаю, до этого места доходит и зависает...
сhar data[4];
for (uint8_t i = 0; sizeof(data); i++)
data = ' ';
3 раза всё просмотрел, пока увидел.)
ну это да, сам со второго прочтения осознал глубину, так сказать. )) А вообще первая запись топикстартера понятная, я такими только никогда не пользовался, наверное потому что так глубоко синтаксис не изучал.
я прошу прощения, не сильно в Си спец. Но разве запись высокого уровня так сильно влияет на машинный код? Я что то думал что записи вида - «i = i + 1;» и «i++;» для машинного кода эквивалентны и только для программиста это упрощение написания. Если это не так - ох уж я лузер-лузер...((
я прошу прощения, не сильно в Си спец. Но разве запись высокого уровня так сильно влияет на машинный код?
Разве Вы не слышали, что в своём младенчестве Си-программы писались от руки на первобытных перфокартах? Знаете, какие они маленькие, дорогие и подотчётные? А ведь на такой бумажке требовалось компактно изложить всю поэзию алгоритма.
Поэтому никакого брахиколона не было дозволено использовать, обходились исключительно постфиксными и префиксными инкрементами и экономили на пробелах.
Это что. Давеча запускаю, до этого места доходит и зависает...
сhar data[4];
for (uint8_t i = 0; sizeof(data); i++)
data = ' ';
3 раза всё просмотрел, пока увидел.)
Почему же зависает, когда на самом деле зацикливается?
Эквивалент:
сhar data[4];
for (; true;)
data = ' ';
Ну
if
(!(++i%16)) считывается влет для человека активноиспользующего С хотя бы год. А вот чтобы расшифровать декларацию функции вроде
уже приходиться напрягаться
"Мы остановились, добившись успешной компиляции следующего:
Почему же зависает, когда на самом деле зацикливается?
Затирает всю память к едреней фени). Ошибся при повторении, там было data[i] = ' ';
То ли дело брейнфак - там синтаксических ошибок практически нет. Чего написал, то и выполняется.
Так и в Си такое же. Туфту написал туфта и выполняется.
Ни фига! Просто постучите по случайным клавишам - какова вероятность, что что-то выполнится? Почти нулевая. Ругнётся компилятор и все дела. А там почти единичная.
Так отключите контроль ошибок и вперёд. Брейнфак это как гоночная машина без тормозов - вещь для самоубийц.
Ну я бы не рискнул тормоза отключать на машине, пусть даже если она по колдо##инам едет.
Что именно и как нужно отключить, чтобы С++ компилятор скомпилировал в исполняемую программу, например, вот такой текст: .юбяьтивс8739шощцвзуя+++-%;!
Тупо хакнуть всю среду,что бы среда считала что никаких ошибок быть не может.
уже приходиться напрягаться
Напрягся .. распрягся - не помогло..
Компилятор скушал сие не задумываясь :O Пронумеровал скобки..
int (*(*fp)(int (*)(int, int), int))(int, int)
1 2 23 4 45 5 316 6
Мозг застопорился на "Указателе на функцию возвращаюшую указатель на int с двумя int аргументами.." ибо остальное в понимание невпихуемо.
И ум приходит что то типа - "Не сабоглаволите ли любезный, такой вот для нас сюрприз изложить так сказать в простонародной форме. Ибо.. э..невпихуемо"
И ум приходит что то типа - "Не сабоглаволите ли любезный, такой вот для нас сюрприз изложить так сказать в простонародной форме. Ибо.. э..невпихуемо"
Ок начнем со случая попроще
Указатель на функцию возвращающую int у которой первый аргумент указатель на функцию возвращающую int c двумя int аргументами, а второй аргумент int.
это то же самое что и предыдущая декларация, только теперь у нас указатель не на функция возвращающую int, а указатель на функцию возвращающую указатель на функцию с двумя int аргументами возвращающая int
Как то так, если ничего не напутал.
Ок начнем со случая попроще
Указатель на функцию возвращающую int у которой первый аргумент указатель на функцию возвращающую int c двумя int аргументами, а второй аргумент int.
это то же самое что и предыдущая декларация, только теперь у нас указатель не на функция возвращающую int, а указатель на функцию возвращающую указатель на функцию с двумя int аргументами возвращающая int
Как то так, если ничего не напутал.
указатель на функцию, у которой первый аргумент указатель на функцию возвращающую int c двумя int аргументами и второй аргумент int, возвращающую указатель на функцию с двумя int аргументами возвращающая int. Да, разжевали, стало понятно. Хитро..
Я пока для себя открыл условный оператор ?
Тривиально.. но какая экономия букв!
используйте декомпозицию, парни. меня вот DIYMan научил.
Он плохому не научит!
Так, ну, вроде, уже почти пятница ....
Не понимаю, с чего благородные доны привязались к этому скромному и вполне себе вегетарианскому куску кода?
Это разве головоломка? Тьфу!
Вот смотрите, какой скетч я нарыл на соседнем форуме! Слабо глянуть и сказать чего он такого делает?
То, что он делает вполне разумную вещь, зуб даю - проверял лично!
Обычно запутывают что-то очень простое. Блинк?
Блинк можно было и покороче написать. Столь же понятно, но покороче :)
дак раз пинмод и диджиталврайт есть, тогда сто очей блинк
Обычно запутывают
Вы недооценили этот пример. Там суть вовсе не в запутывании (его-то и нет по сути), а в том, чтобы заставить препроцессор делать несвойственные ему вещи, которых он "с листа" не делает.
Обычно запутывают
Вы недооценили этот пример. Там суть вовсе не в запутывании (его-то и нет по сути), а в том, чтобы заставить препроцессор делать несвойственные ему вещи, которых он "с листа" не делает.
Ну... Я не рассматриваю программный код как блюдо в ресторане. Скорее, применяю чисто по утилитарной необходимости - как банку тушёнки в походе. Посему - оценить, действительно, не в силах.
Так! По коду вижу - пятница )))
Вы недооценили этот пример. Там суть вовсе не в запутывании (его-то и нет по сути), а в том, чтобы заставить препроцессор делать несвойственные ему вещи, которых он "с листа" не делает.
Тут люди с двумя уровнями вложенности (digitalPins.h) не хотят разбираться, а вы хотите с такой головоломкой.)
В этом примере чуток бы комментариев, ну или названия более осмысленные, и всё было бы значительно приятнее.
В этом примере чуток бы комментариев
Я его тут не выкладывал (было такое желание, но посчитал, что на приличном форуме такому извращению не место). Вот кто его притащил сюда с амперки (или ещё с какой какой помойки, куда он успел метастазы дать), то пусть и комментирует :)))
Вообще же, в примере демонстрируется черезжопная техника организации циклов в С-шном препроцессоре. Там ведь нет ни циклов, ни рекурсии, но "через Альпы", как видите, можно.
Вообще же, в примере демонстрируется черезжопная техника организации циклов в С-шном препроцессоре. Там ведь нет ни циклов, ни рекурсии, но "через Альпы", как видите, можно.
Ну это ты зря, известное изящество в этом есть! ;))))) Хотя автор явно не стремился к сокращению.
А рекурсия есть в самом процессе раскрытия макросов. В определении процесса. После подстановки новая строка просматривается на наличие в ней макросов. Вот это все и эксплуатируют, в меру начитанности. Выглядит - весьма монструозно! Если это прочитать вслух - можно вызвать некрупного демона!
А рекурсия есть в самом процессе раскрытия макросов. В определении процесса. После подстановки новая строка просматривается на наличие в ней макросов.
Если бы задача решалась так просто, армянское радио ею бы не занималось :)
Будучи единожды развёрнут, макрос уже помечен и второй раз не разворачивается. Так что рекурсии-то как раз и нету. Например, вот такая штука
не прокатит с сообщением "'FACT' was not declared in this scope"
Причём не объявлен он именно при втором проходе. Стоит убрать рекурсивный вызов - всё окажется объявленным.
Кстати, вот полный эквивалент того, что в том коде делается:
Как видите, не совсем блинк, скорее бегущий огонёк из 8-ми светодиодов с индивидуальным для каждого диода временем свечения.
Спасибо, я "в уме" развернул. Не раскрывается дважды только одноименный макрос, иначе все совсем плохо было бы.
Не раскрывается дважды только одноименный макрос
Таки да. Он сцуко "помечен". Причём навсегда, т.е. косвенная рекурсия через посредника тоже не прокатит :(
у меня чуток иной код получился
И чем же он иной?
блин вот вы ругаетесь то а)) макросы, рекурсии.... я вижу только закорючки, а вы... прям как в фильме матрица, чес слово
Как всегда, пришёл поручик Ржевский :(
А я тоже о Матрице подумал))) Сидит такой оператор и видит как бабу ебут в шестером. А на самом деле код препроцессора обкатывается на эмуляторе ардуино ))))
Как всегда, пришёл поручик Ржевский :(
эмм, я не хотел опошлить данную дискуссию, напротив, это были мысли вслух, что, такие темы мотивируют немного подучиться... хотя нет, скорее много.
а поручик видимо boom
И чем же он иной?
видимо синтаксисом )))