1. Си / Говнокод #20971

    −52

    1. 1
    2. 2
    3. 3
    4. 4
    static bool is_digit( const char ch )
    {
            return (ch >= '0' || ch <= '9');
    }

    пятничный код, писаный за час до ухода с работы. час после написания был убит на то что бы понять почему `is_digit('/') == true`.

    Запостил: Dummy00001, 26 Августа 2016

    Комментарии (203) RSS

    • Будем честными - булева алгебра не для всех. Сложная штука. Почти элитарная. Не для среднего ума. Нужно быть как минимум гением, чтобы познать её. Уникумом.
      Но вот чего не понимаю я, так это нахера раз за разом плодить isdigit фунции! Почему нельзя поискать в стандартной библиотеке?!
      Ответить
      • Что плохого в дублировании функций?
        Ответить
      • Может человек не может запомнить что || это "логическое или"? Назвали бы по человечески и не ибали бы моск.
        А если в стандартной библиотеке такой функции нет? Это же сишка. И вообще может быть ему ещё потребуются цифры IVXLCDM из древнего рима.
        Ответить
        • Золотые слова.
          Ответить
        • >Может человек не может запомнить что || это "логическое или"?
          >Назвали бы по человечески и не ибали бы моск.

          Как ты посмел покуситься на швитое: сишко- кресто- блядские значочки?
          Сишкобляди негодуют.
          Ответить
          • Вот поэтому я и люблю Delphi.
            Ответить
            • как на счет http://visual-t.ru/?
              Ответить
              • Дизель-паскаль - это кросс платформенная среда разработки с открытым кодом на FreePascal/Lazarus
                Это всё тот же глюковатый Лазарь.
                Ответить
                • Вот так и знал, что ты еще здесь и на паскале своих ботов погоняешь...
                  Ответить
              • >но адаптированные для работы с кодовыми страницами 866 и cp1251.

                Date:
                Mon, 29 Jan 2024 02:14:53 GMT


                Вы ебанутые там все что-ли нахуй?
                Ответить
                • Даже соснольный FAR поддерживает Unicode (в меру; с цветными эмодзи и с некоторыми иероглифами всё плохо; ну и в полноэкранном режиме XDDM всё плохо).
                  Ответить
                  • Да блядь, Console API поддерживает уникод начиная примерно с NT.

                    С момента выкидывания на мороз XDDM (примерно 15 лет назад) уже не актуально
                    Ответить
                • Среда поддерживает 2 встроенных языка - Паскаль и Дизель-Паскаль, но их нельзя использовать одновременно в одном приложении, приложение всегда пишется либо только на Паскаль либо только на Дизель-Паскаль. Паскаль довольно тесно совместим с оригиналом Free Pascal или Delphi. Но есть и существенные различия, например все импортированные функции, типы и классы добавлены в одно адресное пространство и все это доступно в любом модуле, например класс TForm доступен в любом месте кода, если в Delphi или Lazarus требуется подключать модуль forms в раздел uses, чтобы класс TForm был доступен в модуле, то в Дизель-Паскаль это не требуется.



                  Какой пиздец )))
                  Ответить
                • Там ещё документацию писал косноязычный. Я нифига не понял.
                  Ответить
              • сука я сейсас хрюку от верстки и от вопросов
                http://www.programmersclub.ru/

                Этомой любимый форум теперь, словно бы я сам его написал
                Ответить
                • сука как может реально существовать такое в 2023
                  https://programmersforum.ru/showthread.php?s=5418271ba02f889c2e4f979 c137621de&t=345594
                  Ответить
                  • Это же чкольник, который где-то раздобыл реферат и хочет слинковать и сдать.
                    Ответить
                    • Я понимаю, что школьник. Но почему школьник учитца по учебника 1998-го года?
                      Ответить
                    • Написал прогу на C# и запустил ее на обычном ноутбуке с 10-й виндой. Но мой двухядерный ноутбук сильно долго считает задачу. Теперь хочу собрать комп для вычислений из 2-х процессоров по шесть ядер каждый, который будет работать на Win serve.

                      Подскажите, пожалуйста, есть ли разница в написании кода для Win 10 и Win server ? А
                      Ответить
                      • через сервер отправляю информацию а на другом через клиент получаю

                        yte[] buffer = new byte[48];
                        client.Receive(buffer);

                        string komanda;
                        komanda = Encoding.UTF8.GetString(buffer);
                        Ответить
                    • Такой вопрос, как на PHP сделать вызов скрипта 2 из скрипта 1, чтобы в скрипт 1 после вызова продолжил свою работу, апосле завершения работы скрипта 1 скрипт 2 мог бы продолжать свою работу?
                      Ответить
                • Вопрос Вот решила начать учить программирования.С чего начать?Поделитесь полезной информацией - какие видео смотреть, какие книги читать?
                  Ответить
                • Доброго времени суток!
                  ✔️ Предлагаю профессиональную разработку сайтов от 3 т.р.!

                  - Верстка по готовому шаблону из Figma, PSD, Adobe X D, Avocode, Zeplin активно применяя HTML5 и CSS3.

                  Создание сайта под ключ или правки вашего существующего сайта. В работе использую как сайты без движка на чистом HTML/CSS так и WordPress.
                  Ответить
                  • Я очень люблю вышибать ненужные процессы, такие как, iTunesHelper.exe, mbamservice.exe и т.д. Мне надо сделать прогу, которая грохает процессы и чтоб на экране появлялось имя процесса разлеталось на мелкие куски.
                    Кто поможет, буду очень благодарен. Заранее спасибо.
                    Ответить
                    • Я очень люблю вышибать ненужные процессы. Целый день я хожу по городу с большим черным мешком, и
                      Ответить
                  • из InVision то есть верстать не готов, салага
                    Ответить
                • Купить рекламу на форуме - 42 тыс руб за месяц

                  Пиздец. Горите в аду.
                  Ответить
                  • Что можно продавать на этом форуме? Стирательные резинки школьникам?
                    Ответить
                • Текстовый редактор на Perl


                  Написал редактор, но с ошибкой, которую найти не могу, он считывает все текстовые файлы, но если там есть пустая строка, то он останавливается.


                  f ($file ne "") {
                  print "Content-type: text/html\n\n";
                  print "<Title>Текстовый редактор</title>";
                  print "$write\n";
                  open (FILE, "$file");
                  flock (FILE, 2);
                  {
                   local $/ = "";
                   $text = <FILE>;
                  }
                  flock (FILE, 8);
                  close (FILE);
                  print "<b>Файл успешно открыт: </b>\n";
                  print "<Form>\n";
                  print "<Input type=\"text\" name=\"file\" value=\"$file\">\n";
                  print "<Input type=\"submit\" value=\"Открыть\"><br>\n";
                  print "</form>\n";
                  print "<Form>\n";
                  print "<textarea name=\"text\" cols=\"72\" rows=\"25\">$text</textarea><br>\n";
                  print "Сохранение файла:<br>\n";
                  print "<input type=\"text\" name=\"newfile\" value=\"$file\"><input type=\"submit\" value=\"Сохранить\">";
                  }


                  пожалкйста скажите что это сообщение 2000-го года
                  Ответить
          • > Как ты посмел покуситься на швитое: сишко- кресто- блядские значочки?

            ну тащемта в стандарте есть "человеческие" кейворды or/and етц, вот только я случаев их использования видел 2 раза
            Ответить
            • У нас запрещена конструкция вроде (!(, нужно писать (not (
              Ответить
              • У нас тоже
                Ответить
              • Лучше сделайте, чтобы вместо (!( надо было писать (!!!(
                Такой-то кодстайл.
                Ответить
              • в самопальных контейнерах я уже давно леплю Empty()/Full()/NotEmpty()/NotFull(). пара другая строк в реализации - но просто сказка в использовании.

                на самом деле немного даже обидно что народ не знает что в крестах уже давно есть not/and/or.
                Ответить
                • ну справедливости ради стоит сказать, что мелкософтовский компилятор хреново поддерживает все эти кейворды, они там являются макросами объявленные в iso646.h, а включение опции /Za (кажется), которая добавляет собсно нормальную версию, фейлит сборку любого кода с инклюдами винапи, так что пользователи мелкософта могут автоматически не знать про них
                  Ответить
                • А потом после пары месяцев поддержки и багфикса там окажется !ass.NotEmpty().
                  Ответить
                • > Full()
                  Не люблю это слово, неоднозначное оно... Где-то его юзают тупо как !empty(), а где-то - когда реально контейнер забит под завязку и в него больше ничего не засунуть... В итоге всегда приходится доку читать.
                  Ответить
                • бля

                  хуясебе
                  Ответить
            • Qt::Orientation or = layout->orientation();

              // Да почему ж не компилируется?
              Ответить
        • > Может человек не может запомнить что || это "логическое или"?
          Может для него это вообще конкатенация
          Ответить
          • Стандартных обозначений нет, но вы держитесь. Хорошего вам настроения!
            Ответить
            • показать все, что скрытоСтоит отметить, что, если ехать в секс-тур по Камеруну, то языкового барьера между мною и тамошними шоколадными зайцами не возникнет, ибо говорят там по-английски; а уж я с мало-мальским знанием английского языка завсегда смогу прокричать "Deeper, deeper!", верно?
              Ответить
      • > Но вот чего не понимаю я, так это нахера раз за разом плодить isdigit фунции!

        стандартная библиотека умеет только плюс, минус и ребут. добро пожаловать в программирование встроенных систем.
        Ответить
        • Я помню в каком-то старом компиляторе Си в хелпе были перечислены модули и функции стандартной библиотеки, которые не используют оперативку (т. е. всё выполняется исключительно в регистрах), чтобы можно было писать программы, прошиваемые в ПЗУ.

          И это нужно не только во встроенщине, а, например, чтобы загрузочное ядро не писать на ассемблере.
          Ответить
          • в смысле у них в стеке нет ничего? или кучу не трогают?
            Ответить
            • стек еще настроить надо. что бы настроить стек нужно знать где физическая память. что бы узнать где физическая память, надо в ROM/этц лезть.

              до кучи дорога еще больее длиная.
              Ответить
              • сейчас уже всё можно через acpi узнать
                но я не понимаю нафига тогда на си это писать?

                какое преимщуество у сей перед асмом если нет ни картинок, ни разговоров ни стека ни кучи?
                Ответить
                • > сейчас уже всё можно через acpi узнать

                  деталей не знаю, но на линухе - официальная реализация ACPI писаная преимущественно Intel'овцами - это 4МБ сырцов.

                  удачи пытаться это счастье на голом железе запускать.

                  ЗЫ то ли я отстал от времени, то ли народ совсем не понимает catch-22 бутстрапа.
                  Ответить
                  • да, чего я хуйню сказал

                    ты совершенно прав
                    acpi машина тяжеловата для таких задач)


                    Да я все понима: чтобы что-то сделать нужна операционка, а операционки у тебя нет.

                    Окей, допустим я гружусь через API биоса и железа. Ну там сначала заполняю процессору адрес таблицы GDT, потом ставлю бит в контрольный регистр итд

                    Это я все понимаю

                    но вопрос: нахуя это на сях-то делать??? зачем эти 100 строчек на асме обарачивать в функцыю на сях?
                    Ответить
                    • > но вопрос: нахуя это на сях-то делать??? зачем эти 100 строчек на асме обарачивать в функцыю на сях?

                      народ просто не хочет парится с асмом. поэтому на асме пытаются делать только самый минимум.

                      100 строк асма может быть для любителей и не сильно много, но если тебе несклько проектов поддерживать на разном железе, то у тебя потенциально старновится несколько "100 строчек асма". в добавок - "100 строк асма" которые не всякий может написать или поправить.
                      Ответить
                    • ого, макака имени 2016-го
                      Ответить
                      • Как ты попал в этот тред?
                        Ответить
                        • Я сюда гыгыкать пришел
                          Ответить
                        • Зашёл в случайный.

                          Потом инкрементил счётчик и смотрел те, где есть какой-то пиздёж
                          Ответить
                          • Какой скилл )))
                            Ответить
                            • Скорее, какой анскилл.

                              Всё хочу сделать юзерскрипт, который добавлял бы кнопки перехода на следующий и предыдущий говнокоды, да лень
                              Ответить
                            • Кстати, наврал. Сюда я зашёл, потому что по приколу искал, что есть на ГК про Lazarus
                              Ответить
                • > через acpi узнать
                  Он, видимо, о стартовом коде BIOS'а, который просыпается в темноте и без памяти. Вот там да, чтобы юзать память её надо сначала включить... А до этого или хаки с кешем или romcc...
                  Ответить
                  • борманд, если не секрет, тебе скоко лет? ты такой умный (не сарказм)
                    Ответить
                    • 13
                      Ответить
                      • Не, серьёзно
                        > 40?
                        Ответить
                        • Не, я не настолько стар.
                          Ответить
                        • Борманд правда умный. Хотя казалось бы: любой программист должен хотя-бы в общих чертах понимать про биос и первоначальную загрузку компа.

                          Но по какой-то причине 99% программистов умеют только канвас в джаваскрипте, а всё что ниже уровнем для них темный лес
                          Ответить
                          • но он во всех темах шарит, абсолютно во всех что хоть как-то касаются IT (и не только)
                            Ответить
                          • Нахуя это знать?
                            Ответить
                            • Да нинахуя, Сём.

                              Нахуя вообще что-то про комптютеры знать?
                              Ответить
                              • Чтобы получать $ или ради интереса. А если мне биос не всрался и $ за него мне не платят, то и знать незачем.
                                Ответить
                                • Если тебе не интересно и ты никогда с ним не пересекаешься то и не изучай

                                  но открою тебе страшную тайну: чем шире у тебя кругозор, тем больше идей ты можешь позаимствовать, тем лучше ты понимаешь как все НА САМОМ ДЕЛЕ работает, тем больше всего интересного ты можешь придумать, тем больше проблем ты можешь решить, тем ты круче как специалист, тем больше разных работ ты можешь выполнять, и наконец чтобы мозг не засох его нужно тренировать изучая новое.
                                  Ответить
                                  • чепуха. ты еще скажи что знание это сила.

                                    ЗЫ на самом деле, параллели между разными прикладными областями проводить могут не многие. поэтому и знания для них из других областей просто обуза. высшее образование помогает этот барьер перейти, но не всем удается.
                                    Ответить
                                    • Я в свое время наблюдал как энтерпрайз заимствует из архитектуры операционок, а там заимствуют из архитектуры компьютера в целом, так что знать как что работает вообще полезно.

                                      Ну правда: чем Enterprise service bus не System Bus?
                                      Ответить
                                    • >>но не всем удается.

                                      ну так стать программистами не всем удается

                                      многие так и пишут одинаковый бойлерплейт на галерах годами.

                                      Никогда не видели энтерпрайзника у которого 15 лет опыта написания DAO бинов?
                                      Ответить
                                    • Да какие параллели можно провести с байтоеблей в биосе? Еще спеку pdf для общего развития почитайте.
                                      Ответить
                                      • проблемы бутстрапа есть в любой платформе
                                        вот даже в Spring Boot
                                        Ответить
                                    • > проводить могут не многие
                                      Вернее, не только лишь не многи. Мало кто это может делать.
                                      Ответить
                            • Нахуя это сегодня знать, если не зарабатывать написанием дров или эксплоитов?
                              Ответить
                              • нахуя знать как работает BTree если не зарабатывать написанием индексов для субд?
                                Ответить
                                • Если бы btree было какой-то специфичной хуйней, как биос, то и не надо было бы. А бтри - вполне себе дженерик структура данных, дружественная к кэшу.
                                  Так что ты сравнил ужа с ежом.
                                  Ответить
                                  • да нет ничего специфического в биосе
                                    фирмварь и загрузка компа это тоже дженерик вещи

                                    я же не предлагаю тебе выучить наизусть аргументы утилиты wbadmin, правда?
                                    Ответить
                                  • btree в ipv6 маршрутизации еще используется.
                                    Ответить
                      • В системе с каким основанием?

                        bormand: 13
                        CHayT: В системе с каким основанием?
                        bormand: 13
                        CHayT: В системе с каким основанием?
                        ...
                        Ответить
                    • С каких пор это считается признаком ума?
                      Ответить
                  • лол, если он говорит про программирование биоса то там вообще отдельный мир

                    там надо "знать" по какому адресу сидит какой девайс и как его включать
                    Ответить
                  • хехе
                    а ROMCC это безстековый си?
                    Ответить
                  • > через acpi узнать

                    А через анус никак нельзя узнать?.. Я люблю через анус.
                    Ответить
                    • Ну там примерно так всё и узнается.

                      Но ACPI это еще пол беды. Раньше была в PCI такая тема: Interrupt routing. Вон там можно убиться
                      Ответить
            • В смысле вооюще ничего нет вообще.

              ты можешь положить целое число (или символ) в регистр, и вызвать функцию, которая её оттуда считает.

              Стект тебе не нужен впринципе
              Ответить
              • Стек обычно нужен рекурсивным функциям и для локальных переменных, но... вместо использования стека рекурсивная функция или функция с локальными переменными может маллокать.

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

                Единственное, для чего стек необходим, так это для адресов разврата. Да и то на некоторых рахит-тинктурах можно справиться без него: класть адрес разврата в регистр, а если тебе из функции нужно вызвать функцию, то сохранять его где-нибудь (маллокать).
                Ответить
          • Этого не видел. Видел извратные куски асма для того что бы по быструхе настроить окружение что бы можно было стандартную библиотеку вызывать. И потом всю остальную инициализацию стандартной библиотекой добивать. Видел и в далёком прошлом под дос, и даже пару лет назад для арма.
            Ответить
            • Нашёл.
              Copyright (C) 1992 MetaWare Incorporated; All Rights Reserved.
              
                                        High C/C++ Version 3.0
                                     Globally Optimizing Compiler
                              for Extended DOS 80386/486 and Windows 3.0
                                              April 1992
              
                                    +-----------------------------+
                                    | Embedded Applications Notes |
                                    +-----------------------------+
              
              If you are developing code for use in embedded systems, and you are not
              writing your own library, use High C 1.x libraries (HCC.LIB or HCE.LIB)
              instead of the High C/C++ 3.0 libraries.  HCC.LIB and HCE.LIB are included in
              the High C/C++ 3.0 distribution.  HCC.LIB and HCE.LIB facilitate making an
              embedded product because they isolate system dependencies in a few modules.
              
              This file describes how to modify MS-DOS-dependent modules.  Use this
              information in addition to the "Embedded Applications" chapter in the High
              C/C++ Programmer's Guide.
              
              
              No MS-DOS Support
              -----------------
              
              Systems with no operating-system support are the traditional pattern for
              embedded systems.
              
              A system with no MS-DOS support requires more radical modification of INIT.ASM
              than systems with partial support.  INIT must still be used, however, because
              some memory management is necessary.  Set the conditional assembly for NO_DOS,
              set Stack_length to a number suitable for your conditions, and create a new
              INIT.OBJ.
              
              Lack of operating-system support severely limits many of the library functions
              you may have used previously.  The High C functions listed in  Table 1 require
              no DOS support.


              А нет, не то. Там будет список функций, не ссылающихся на ОС. А список функций, не использующих оперативку, был где-то ещё. Может быть, в ROMCC?
              Ответить
              • > А нет, не то.

                Close enough. В MS-DOS времена это было нормой. Не то что бы OS таки и подталкивала ею пользоваться, была чем то удобным/надежным/незаменимым(*). Сейчас подобный паттерн проявляется в ARM системах где OS вообще нет.

                (*) Сейчас я понимаю почему в те времена юниксоиды над MS-WinDOS смеялись... Они уже в 80х настоящими ОС пользовались. А вин/досы до сих пор... аптайм в один месяц только с трудом, и программировать под них как было напряжно, так и осталось.
                Ответить
                • Ну так микрокомпьютеры прошли тот же путь что и большие компьютеры за 20 лет до этого

                  в 85 году у серьезных компов уже была виртуальная память, защищенный режим, многопользовательскость, вытесняющая многозадачность, безопасность на уровне fs и API на C.

                  А у персоналок был API на прерываниях в firmware, один пользователь и 640 к памяти на всех. Прямо как у большых компов 60х.
                  Ответить
                  • так лучше не говорить про эти вещи. PC стоили в разы меньше чем "настоящие" компьютеры. их могли купить нормальные люди.

                    SGIшки на которых делали второго терминатора (1991) столи 9-12 штук. White box PC в те времена стоили 1.5-3 штуки. Производители не дураки и не торопились цены сбрасывать. Очень сильно не торопились. Наличие операционок тоже роль играло - и кроме некрософта и SCO никто в это деньги не вкладывал. линух и фри-бсд не от хорошей жизни люди (любители!) делали.
                    Ответить
                    • >SGIшки на которых делали второго терминатора (1991) столи 9-12 штук.
                      ебать ты олд
                      Ответить
              • А куда делся иканус?
                Ответить
      • программисты не обязаны уметь в "OR" и "AND", они же не логики.

        > нахера раз за разом плодить isdigit фунции!

        Зачем использовать готовую, отлаженную десятилетиями функцию из стандартной библиотеки твоего языка, если можно написать свою и бажную?
        Ответить
    • Вот поэтому нехуй такой код вообще писать. Или пиши тесты - прогоняй через функцию хотя бы первые 256 символов.
      Ответить
      • Как будто бывают вторые 256. Тогда уж саму функцию сразу табличкой задавать
        bool resultat = {false, false, ..., true, ..., false};
        return resultat[ch];

        Ну тесты писать конечно надо. Только не так.
        Ответить
        • скобки проебал
          Ответить
        • В нормальных языках и юникод бывает.
          Ответить
          • ха ха ха
            это говорит питониста, у которого вот уже 10 лет не могут перейти с двойки на тройку потому что не могут дговориться о всех этих str, unicode, bytes, литералах b'', u'' итд
            Ответить
          • Питон не нормальный язык, а говно. На нем пишут только хипари в коричневых штанах. Покранемере нормальных людей кто на нем пишет не видел.
            1. Ебанутый синтаксис
            2. Что есть в пхп тут нет
            3. Листы, словари, кортеджи
            4. Нахуй всратый юникод.
            5. Динамическая типизация
            6. Нет адресации и указателей
            Ответить
            • ходят слухи что почти у всех скриптовых ЯП динамическая типизация.
              Ответить
            • Зато есть Comprehensions
              Ответить
              • Comprehensions это наверное самая долбанутая фича питона, которая особенно выделяется на фоне всего остально синтаксиса питона: "мы сделаем правильный(с)(тм)(r) синтакс!... но вот тут влепим кусочек перлизма".
                Ответить
            • >2. Что есть в пхп тут нет

              SQL инджекшенов из коробки?
              Ответить
    • вместо || поставь &&
      Ответить
    • function is_digit(ch: char): boolean;
      begin
              Result := ch in ['0' .. '9'];
      end;


      Я всегда говорил, что сишечке не хватает диапазонов и множеств.
      Ответить
      • http://stackoverflow.com/a/23924591/360695

        ЗЫ классическая реализация isdigit/etc для ASCII/Latin1 это массив 256 байт, каждый байт это бит маска к каким классам эта буква принадлежит.
        Ответить
        • Кстати, да, спасибо гэцэцэ за возможность использования диапазонов в свитч-кейсах:
          switch(ch){
                 case '0' ... '9':
                      return true;
                  default:
                      return false;
              }


          Уже что-то. Хотя хотелось бы и в других местах диапазоны увидеть.

          > ЗЫ классическая реализация isdigit/etc

          Собственно <ctype.h> и рассчитывает на то, что в исполнимый файл будет вшит этот массив. Хорошо, что в байте только 8 бит, а то пришлось бы таскать больше мусора.
          Ответить
          • > Хотя хотелось бы и в других местах диапазоны увидеть.

            диапазоны плохо сочетаются со статической памятью. да и динимику делать с ними тоже опастно.

            думаю что на каком буст пп (boost_pp_for) можно сваять раскрытие `'0' .. '2'` в `{ '0', '1', '2' }`. в 11ых крестах вот такое уже работает - `for (char a : {'0', '1', '2'})`. вопрос сможет ли компилер это съоптимизировать.

            вот на этом:
            #include <initializer_list>
            bool is_it_really_a_digit(char c)
            {
                for (char a : {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}) {
                        if (c == a)
                                return true;
                }
                return false;
            }


            clang догадался как соптимизировать - а gcc нет. (можшь на https://gcc.godbolt.org погонять)
            Ответить
            • > догадался как соптимизировать
              Неужели в вычитание и сравнение?
              Ответить
              • да:
                is_it_really_a_digit(char):              # @is_it_really_a_digit(char)
                        addb    $-48, %dil
                        movzbl  %dil, %eax
                        cmpl    $10, %eax
                        setb    %al
                        retq


                гцц в лоб генерит (в зависимости от уровня оптимизации) либо таблицу с числами и цикл, либо пачку сравнений и джампов:

                is_it_really_a_digit(char):
                        cmpb    $48, %dil
                        je      .L11
                        cmpb    $49, %dil
                        je      .L11
                        cmpb    $50, %dil
                        je      .L11
                        cmpb    $51, %dil
                        je      .L11
                        cmpb    $52, %dil
                        je      .L11
                        cmpb    $53, %dil
                        je      .L11
                        cmpb    $54, %dil
                        je      .L11
                        cmpb    $55, %dil
                        je      .L11
                        cmpb    $56, %dil
                        je      .L11
                        cmpb    $57, %dil
                        sete    %al
                        ret
                .L11:
                        movl    $1, %eax
                        ret
                Ответить
              • Да, именно. Кстати рекомендую посмотреть, как оптимизируется этот говнокод: http://govnokod.ru/212
                Ответить
                • поучительно: основательное ГК - но все конпилеры оптимят на порядок лучше.
                  Ответить
                • Обычная оптимизация свича. Для непрерывных диапазонов делает джамп-тейбл, для прерывистых бинарное дерево поиска.
                  Ответить
                  • Где ты там джамптейбл или дерево увидел, guest? Оптимизации включил хоть?
                    Ответить
                    • Прочитал асмовый выхлоп там в коменте, не догадался сам проверить. ОКЕЙ ТЫ ПРАВ
                      Ответить
              • но на isalpha даже кланг сдался:
                bool is_it_really_an_alpha(char c)
                {
                    for (char a : {
                'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
                'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
                                    }) {
                            if (c == a)
                                    return true;
                    }
                    return false;
                }


                код почти идентичен у кланга и гцц:
                is_it_really_an_alpha(char):             # @is_it_really_an_alpha(char)
                        movl    $.L.ref.tmp.1, %ecx
                        movzbl  %dil, %edx
                        movl    $.L.ref.tmp.1+52, %esi
                .LBB1_1:                                # =>This Inner Loop Header: Depth=1
                        movb    $1, %al
                        movzbl  (%rcx), %edi
                        cmpl    %edx, %edi
                        je      .LBB1_7
                        movzbl  1(%rcx), %edi
                        cmpl    %edx, %edi
                        je      .LBB1_7
                        movzbl  2(%rcx), %edi
                        cmpl    %edx, %edi
                        je      .LBB1_7
                        movzbl  3(%rcx), %edi
                        cmpl    %edx, %edi
                        je      .LBB1_7
                        addq    $4, %rcx
                        cmpq    %rsi, %rcx
                        jne     .LBB1_1
                        xorl    %eax, %eax
                .LBB1_7:
                        retq
                
                .L.ref.tmp.1:
                        .ascii  "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"


                ... вот поэтому в крестах и нет диапазонов.
                Ответить
                • Можно распилить этот цикл на два с непрерывными диапазонами.
                  https://godbolt.org/g/OKnVrx
                  Ответить
                • Алсо не знал, что в плюсах можно оставлять запятую в конце. Думал, это только во всякой хуйне типа го.
                  Ответить
                • seg000:2D80 mov ax, 41h
                  seg000:2D83 push ax
                  seg000:2D84 mov ax, 5Ah
                  seg000:2D87 call sub_14D8
                  seg000:2D8A mov ax, 61h
                  seg000:2D8D push ax
                  seg000:2D8E mov ax, 7Ah
                  seg000:2D91 call sub_14D8
                  Ответить
                  • Случайно нажал Ctrl+Enter. Сейчас исправлю.
                    Ответить
                  • А нахуй перед кэлом мов ах
                    Ответить
                    • Этот код я вообще случайно отправил, рука сорвалась, а отредактировать не успел.

                      Если интересно, то это код, сгенерированный антикварным TP 3.0, в котором ещё не было модулей и соглашения о вызовах были другими. Если я правильно, понял, то через ax передаётся последний аргумент встроенных функций. Такая вот оптимизация.
                      Ответить
                • Пример для Turbo Pascal:
                  function is_alpha(ch: char): boolean;
                  begin
                          is_alpha := ch in ['A' .. 'Z', 'a' .. 'z'];
                  end;


                  Выхлоп дизассемблера (BP 7.0):
                  seg000:000E                 mov     al, [bp+4]      ; DATA XREF: Halt(Word)+1Cr
                  seg000:0011                 cmp     al, 41h ; 'A'
                  seg000:0013                 jb      short loc_21    ; DATA XREF: Halt(Word):loc_1C5r
                  seg000:0015                 cmp     al, 5Ah ; 'Z'
                  seg000:0017                 jbe     short loc_25
                  seg000:0019                 cmp     al, 61h ; 'a'
                  seg000:001B                 jb      short loc_21
                  seg000:001D                 cmp     al, 7Ah ; 'z'
                  seg000:001F                 jbe     short loc_25
                  seg000:0021
                  seg000:0021 loc_21:                                 ; CODE XREF: seg000:0013j
                  seg000:0021                                         ; seg000:001Bj
                  seg000:0021                 mov     al, 0
                  seg000:0023                 jmp     short loc_27
                  seg000:0025 ; ---------------------------------------------------------------------------
                  seg000:0025
                  seg000:0025 loc_25:                                 ; CODE XREF: seg000:0017j
                  seg000:0025                                         ; seg000:001Fj
                  seg000:0025                 mov     al, 1
                  seg000:0027
                  seg000:0027 loc_27:                                 ; CODE XREF: seg000:0023j


                  На вхоже два непересекающихся диапазона. Однако, оптимизатор догадался вообще не создавать множество в памяти, а сделать всего четыре сравнения.
                  Ответить
                  • показать все, что скрытоЗасади мне по самый корень.
                    Ответить
                  • про паскалевы множества я уже и забыл... массивы в крестах добавили - может когда догадаются и множества добавить? если не ошибаюсь, типичная реализация в паскале это enum + bitset. но здесь компилер еще и сумничал.

                    я про битсет в крестах думал, но поленился. и в крестах это только bitset и делается, потому что нативного типа данных никакого не хватит. но так как это битсет, у него и статической инициализации никакой нет, придется через переменные крутится извращатся инициализировать.
                    Ответить
                    • В Турбо Паскале, например, множества можно создать только из типа, диапазон значений которого укладывается в байт (для более широких диапазонов реализовывать побоялись, ибо изначально TP был рассчитан на conventional память). Представлено множество битсетом из 256 битов = 32 байт.

                      Замечательно, что на x86 уже есть хорошие инструкции для работы с такими битсетами (bt/btr/btc/bts).

                      И да, компилятор иногда умничает, и, если множество представлено константой, то и вовсе его выкидывает, как в этом примере.
                      Ответить
                    • Да, я ещё где-то уже писал, но на всякий случай повторю. Паскалевы множества — это попытка реализовать одну из конструкций языка SETL:
                      http://cs.nyu.edu/~bacon/setl/doc-legacy/setlprog.pdf

                      SETL имел алголоподобный синтаксис, появился на десятилетие раньше Си и Паскаля, но почему-то его идеи нашли применение в Питоне, в ECMAScript (да и то реализована малая часть), а в языки со статической типизацией его конструкции вводить боялись.
                      Ответить
                      • Кстати. Сейчас бесплатную делфю впаривают (да, чёрт возьми, совершенно бесплатно).
                        Она что либо представляет из себя? Не пробовали? Заставка с видом на вечерний Берлин смотрится очень романтично.
                        Ответить
                        • Да, Берлин красив. На Москву и на Питер чем-то похож. Не то, что Бавария с её убогими панельными коробками. Я даже начинаю догадываться, почему пидар такой злой.
                          Ответить
                          • Бесперспективность. Он хочет быть светским львом иметь возможность выставлять напоказ свои успехи. А их очевидно нет.
                            Ответить
                          • > Да, Берлин красив. На Москву и на Питер чем-то похож.

                            Не знаю. Дрезден мне нравится больше. Имел счастье там 2 года жить.

                            А если современный мегаполис - то тогда Франфурт. Оч даже ничего место.

                            А Бавария... Это на любителя: там жизнь слишком размеряная и консервативная. Я к слову там панельных коробок вообще не видел - но да Бавария большая (деревня). в Германии в принципе панельные коробки редки и есть только в восточной (== пережиток совка), либо дешёвое социальное жильё (== кучи русской и не только пьяни, бабулек и прочего, прям заповедник совка: а вы помните как при Сталине все круто было? потому что эти немцы вообще нифига не умеют. не то что Сталин).
                            Ответить
                            • показать все, что скрытоВ гермашке лучше, чем в рашке? Имеет смысл переезжать?
                              Ответить
                              • И да, и нет.

                                Если тебе нравится размереная спокойная жизнь - то однозначно да. (Но и найти место где жизнь бьёт ключём тоже не проблема.)

                                С другой стороны, не все легко переносят переезд и отдаление от друзей и близких. И по началу, ни времени ни денег туда сюда кататся не будет. Но Европа/Германия это все равно намного ближе чем какие США (знакомый нелегально выехал - как нелегал прошел через пару нищенских периодов; ~5 лет родителей не видел, пока не легализовался).
                                Ответить
                            • Панельки я видел в интернетах на фотках с видами Мюнхена (да, мне где-то попались виды его не лучшей части) и в этой статье:
                              https://de.wikipedia.org/wiki/Plattenbau

                              Вообще платтенбау не имеет отношения к Совку.
                              Ответить
                              • показать все, что скрытоОднако.
                                Ответить
                              • > Панельки я видел в интернетах на фотках с видами Мюнхена

                                "типичная" мюнхенская высокоэтажка (5 этажей максимум в мюнхене) они может только со сторы выглядят как советские панельные (хрущевкие и брежневские застройки).

                                большинство (== все что я видел в М) ближе к советским строениям сталинских времен с высокими потолками. и метраж, и цена у них соответствующая.

                                мюнхен "элитный" город: они там принципиально строят относительно дорогое жильё, которое нормальные служащие могут позволить себе только с трудом. на эту тему тут временами в прессе бывают срачи.
                                Ответить
                        • Тормозная очень (как и все начиная с XE). Особенно если под андроид компилить. А в остальном улучшают потихоньку. Ну и если бесплатная это Starter то лучше не качать а сразу на торрентах нормальную брать, в starter кажется даже автокомплит вырезали.
                          Ответить
                          • показать все, что скрытоА она Wi-Fi поддерживает?
                            Ответить
                          • где нибудь есть толковое сравнение актуальных Delphi и Lazarus?

                            никаких сравнений не нашел - народ рекомендует просто попробовать, но лазарус неожиданно достаточно большой (что-то в районе 250М на бубунте) и у меня так руки до него и не дошли.
                            Ответить
                            • Ну я попробовал Лазарус, после дельфи интерфейс в нем делать это страдание. У меня там фреймы на фреймах через фреймы, лазарус после пары уровней вложенности стал файлы форм корраптить, ну и в целом интерфейс неудобный, кучи всяких мелочей не хватает типа запоминания последнего отредактированного свойства.
                              Но если формы не нужны, то как ide - более-менее. Поглупее чем дельфи, чаще не может угадать тип переменной, но в целом можно пользоваться. Разве что бесит когда он в каком-то одном файле какую-нибудь хитрую конструкцию не может распарсить, и из-за этого весь автокомплит отваливается, вместо этого он будет посылать к месту с "ошибкой".

                              В языке отличия. У генериков другой синтаксис, лямбд нет и не будет(а в дельфи есть), зато перегрузка операторов понятнее сделана, есть "+=" и препроцессор почти-сишного уровня. Но если ничем таким не пользоваться, то совместим.

                              Оптимизация - ну, печальная, с дельфи не сравнить. Зато в лазарусе программы маленькие, а в дельфи они с каждой версией все больше весят.
                              Ответить
        • вообще-то классическая реализация вот https://www.govnokod.ru/212
          Ответить
      • Бля а в этом ты прав. Поэтому паскаль.
        Ответить
    • показать все, что скрыто)))
      Ответить
    • >>>
      Недавно, когда я рассказывал, как мы пишем тесты, я уже упоминал, что в TypeScript’е появилось новое ключевое слово using. Оно позволяет нам сделать код чище и более линейным, избавившись от try/finally.
      >>>

      GCбляди, и их ручное управление ресурсами. Языки с GC -- не безопасные, старайтесь ничего серьезного на них не писать
      Ответить
    • Сидел в толчке и читал какую-то смешную статью на хабре, как за 90 дней стать икспертом по безопасности

      Там короче 10 дней учат сети, 10 дней учат линукс, 10 дней учат питон, и вжух
      Ответить
    • Хамилион хамилион хамилион
      алых роз
      Ответить
    • уважаемые инцелы,
      это для вас https://twitter.com/Q0MT6pFmbVqynsM/status/1751858160334205205
      Ответить
      • Сиськи должны свисать вбок
        Ответить
        • Ишь ты цырлих-манирлих какой, иди тогда настоящую тян иби как дурак
          Ответить

    Добавить комментарий