1. C++ / Говнокод #3767

    +161

    1. 1
    2. 2
    width ? width-- : width;
    height ? height-- : height;

    Ахуй нехуевый. Не говнокод, наверно, но всё же.

    Запостил: Altravert, 23 Июля 2010

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

    • По-моему, нагляднее так:
      if( width ) width--;
      Ответить
      • ага, а я б написал if( width>0) width--;
        правда тернарный оператор скомпилится в cmov, а с ифом может возникнуть условный переход, и насчет скорости хз
        но ИМХО наглядность важнее.
        Ответить
        • А если width объявлено как unsigned, то >0 в if'е не обязательно.
          Хотя, опять же, если воспринимаем как число для наглядности лучше писать >0.
          А если width уже было отрицательно, то в исходном варианте уйдем в глубокий минус.
          Ещё хотелось бы отметить, что обычно результат тернарной операции чему-то присваивается. Если например :
          a = width ? width-- : width;
          , то с учетом постдекремента развернётся в
          a = width;
          if( width ) width--;
          . Более весело получается, когда
          width = width ? width-- : width;
          . Такой код можно вообще убрать. Если конечно декремент не имеет побочных эффектов.
          Ответить
          • >>> то с учетом постдекремента развернётся в
            >>>a = width;
            >>>if( width ) width--;
            немного неверно там вместо a - временная переменная

            в общем современные компилеры достаточно умны чтоб не сейвить во временные переменные и могут вставить cmov если это целесообразно.

            А вообще надо писать наглядно, и расчитывать на компилер в критичных по скорости местах - BIG MISTAKE - на своем опыте знаю - лучше написать на асме.

            >>>А если width уже было отрицательно, то в исходном варианте уйдем в глубокий минус.
            ИМХО в большинстве случаев объявить width как signed уже говнокод....
            Ответить
            • > немного неверно там вместо a - временная переменная
              Не совсем понял, что неверно.
              Ответить
              • ну кагбе постдекремент создает временную переменную и вполне реально примерно такое
                a=tmp=width;
                if( tmp) width--;

                короче tmp - ячейка отличная от width
                вообще эти инкременты весьма мутная тема и все зависит от компилера особенно в С/С++
                мы с инканусом уже обсуждали это здесь...

                не помню номер но сам говнокод в котором мы это было выглядел как-то так
                a=a++;
                почитав тот тред можно увидеть, как от этих временных переменных сильно меняется результат.
                к примеру MSVC - вообще их не использует и тулит все в одну ячейку.
                Ответить
                • http://govnokod.ru/3535
                  Ответить
                • >короче tmp - ячейка отличная от width
                  Но при этом на момент вычисления условия if'а значения у них одинаковые. В однопоточном приложении.
                  Ответить
            • Ну смотри, есть об'ект, у него есть минимальная ширина и максимальная. Как обозначить, что максимальная ширина не ограничена? Первая мысль -- (-1). Довольно логично. Вторая -- завести спец bool, и от этой мысли хочется bool'евать кровью. Предложи еще?
              Ответить
              • Вероятно, не стоит путать width (текущая ширина) и maxWidth (предельная ширина).
                Ответить
                • Пример:
                  struct Size
                  {
                  int width;
                  int height;
                  };
                  Size maxSize;

                  Контекст -- он нас всегда всех обламывает.
                  Ответить
                  • А что если использовать MAX_INT или вроде того?
                    Тогда не нужно дополнительных проверок, типа:
                    if( maxSize.width == -1 ) без ограничений;
                    Ответить
                    • Я по каким-то причинам отмел эту идею, но причин не помню)) Твоя правда, это выход.
                      Ответить
          • Аппрувлю: це никуда не присваивается, что в первую очередь меня сбило с толку. В минус по логике уходить не должно, но сделано всё так что если будет понижаться -5 до -6, то будет работать как задумано.

            Оффтоп: вообще, я такую эволюцию прослеживаю
            C -> Objective-C -> C++ -> Workaround-C++.
            А вас, дорогие друзя, это не бесит?
            Ответить
        • IMHO, что важнее, каждый программист выбирает для своего проекта сам. А в остальном полностью согласен, мне лично тоже привычнее смотреть на "if(width) width--;"
          Ответить
          • Ага. И для еще кучки других программистов он же решает? Или каждый себе сам в своей строке кода?
            Ответить
            • Я извиняюсь, если я нечётко сформулировал, но по-моему, при желании, понять что я хотел сказать достаточно несложно.

              Я хотел сказать, что по задумке проекта приоритеты могут быть расставлены как как только захотят соотвествующие люди в данном проекте.
              Ответить
        • >правда тернарный оператор скомпилится в cmov
          >насчет скорости хз
          Годик назад проверял. На современных процах cmov медленее, чем условные переходы. cmov плохо спаривается.
          Ответить
        • >ага, а я б написал if( width>0) width--;
          А Я: if( width>0) --width; Быстрее, хотя экономия на спичках.
          Ответить
          • >>>На современных процах cmov медленее
            >>>А Я: if( width>0) --width; Быстрее, хотя экономия на спичках.
            согласен
            Ответить
            • но иногда cmov бывает быстрее, потому я и написал
              "насчет скорости хз"
              Ответить
              • >но иногда cmov бывает быстрее
                На да. На старых компах. Но смысла ориентироваться на такие компы я не вижу. Им уже лет 10-15.
                Ответить
                • не только. да до P4 его использование предпочтительно
                  но и на новых Core 2,i7, AMD - есть ситуации, где cmov - быстрее.
                  все зависит от вероятностей усл. джампа
                  Ответить
                  • Согласен. Тестировал, когда ветка под ифом выполнялась достаточно редко Примерно в 1/64 случаев.
                    Видимо предсказание ветвлений у меня хорошо срабатывало по такому случаю.
                    А вот cmov и прочие варианты, например через арифметику выполнялись дольше, да и ипользование ассемблерных ставок вставляло палки в колёса оптимизатора.
                    Ответить
                    • короче в алгоритмах где 50/50 таких как декомпресия сжатых данных (допустим в арифм. кодир.)- cmov дает до 30% (Core2, AMD)
                      даже на P4 - есть выигрыш
                      или при парсинге чисел - с равновероятным распределением битов
                      если кому пруфлинки - реквестируйте
                      тем более cmov - генерирует меньше кода
                      так что толк от нее в определенных ситуациях есть..
                      Ответить
                      • Я верю. Но про зависимость производительности метода от частоты выполнения условий - я бы почитал. Реквестирую. :)
                        Ответить
                        • просто я тоже недавно интересовался
                          интересные дискассы знающих парней
                          https://mail.mozilla.org/pipermail/tamarin-devel/2008-April/000455.html
                          http://ondioline.org/mail/cmov-a-bad-idea-on-out-of-order-cpus

                          пруф спид-апа в реальном проекте
                          http://git.videolan.org/?p=x264.git;a=commitdiff;h=bf9bf7acf61da 13d9cc45c35291f61e614d7414c
                          Ответить
                          • там при копи-пейстинге пробел почему-то вставился между da 13 кажись

                            короче последний линк - реализация арифм. кодинга на cmovax
                            Ответить
          • А я заявляю: это читается хуже! Бебебе.
            Ответить
            • >Бебебе.
              Да... Жара какая-то сегодня по особенному сильная... О_о
              Ответить
            • >читается хуже
              Ну только теми людьми, у которых в языках объект, над которым выполняют действие стоит на первом месте, а действие на втором. Вы к таким не относитесь, как рускоговорящий.
              Например, Вы же не говорите "Слоников посчитать", а говорите "Посчитать слоников".
              Ответить
              • Да не обращайте внимания, я же не серьезно. Каша в башке весь день, юморяю плохо.
                Ответить
    • бред какой-то, не вижу никаких разумных применений
      а может это вложено в цикл или рекурсию и таким образом обнуляются width и height ? ))
      Ответить
      • Как верно подметил absolut, это зашифрованное
        if (some) some--;
        And it's awesome))
        Ни цикла, ни рекурсии -- просто -1, и все.
        PS: И придумал это не я, что не может не радовать)
        Ответить
      • > ...и таким образом обнуляются width
        Тоже первая мысль была об этом. Обрамить всё в цикл и получить истинный ГК :)
        Ответить
      • специально переделывал когда-то свои лабы по С++ в нечитабельный вид, если какой-то неуд просил лабу "посмотреть для примера":

        int i=-1;
        while (i+=(5==3=>7?3:5),i<a) { ... }

        есстесн неуд не поймёт что там написано, и будет сдавать лабу как есть (без переделывания), ну а преп его заставит объяснить что к чему и написать в нормальной форме;

        и неуд ищет кто ему сможет объяснить код, но таких не находится, и тогда ему приходится грызть учебник или заказывает нормальную лабу =Ъ
        Ответить
        • а я наоборот помогал, причем бесплатно... и заработал на этом много опыта и пива... многие из них уже не станут программистами...
          а вот вы сами растите себе конкурентов...
          Ответить
          • тут ситуация немного иная;
            я разделяю понятия "Помощь" и "Работа":
            - если кто-то просит дать ему совет или объяснить как это делается (в общих чертах) - это Помощь
            - а если кто-то просит готовый код, который будет использован для личной выгоды, - то это уже Работа

            Помощь - естессно бесплатно, и в любое время (если есть оное)
            а Работа - должна оплачиваться (иначе смысл оного пропадает)
            ---------------------------
            неуды, про которых говорилось выше, - просят выполнить работу, под видом помощи;
            притом не за работу, не за помощь оные даже спасибо не скажут, не то чтобы пивом угостить -(
            поэтому приходится идти на такие извращения..

            (одной девушке такие неуды вылезли на шею и используют, притом с упрёками типа: "если ты мне не поможешь, меня из-за тебя лишат стипендии".
            а та девчёнка помогает им: абсолютно бесплатно делает лабы и объясняет как защитить;
            смотря на это - аж противно становится)

            зы: да и с их складом ума, программистами им Никогда не быть, так что конкурентов тут не будет.
            (хотя они, сцука, при абсолютном отсутствии знаний получают повышенную стипендию)
            Ответить
            • получается что обфускацию кода которую ты предварительно делаешь ты за работу не считаешь, хотя и тратишь свое время...
              Ответить
              • добавить несколько трудно читабельных строк в код, это не соизмеримо с полностью продуманным с нуля алгоритмом и кабе творческим подходом к решению задачи.

                к тому же это только для самых хитрых;
                - остальные же заказывали работу по-нормальному;
                Ответить
              • Он делает это из вредности и любви к искусству :-D

                SRSLY, не проще ли не давать код?
                Ответить
            • >>>хотя они, сцука, при абсолютном отсутствии знаний получают повышенную стипендию

              большинство обычные флюродросы и любители поупрашивать препода
              Ответить
              • А как насчет "ну и пусть дрочат на свою стипендию, а я потом заработаю больше"?
                Ответить
                • помню, я за первые 3 месяца заработал больше за год повышенной
                  и нервы - целые *happy*
                  Ответить
          • +1. Внатуре. Сам таким на первом курсе был, полный нулл, и даже немного на втором. Куда деваться? Просил тоже, но люди отзывчивые попались. Хотя (i+=(5==3=>7?3:5),i<a) я понимал нормально, я мьютексы не понимал.
            И вообще. Диплом имхо нужен чтобы хот куда-то взяли. Красный -- чтоб точно при желании взяли по специальности (ибо так просто вроде не получить). А по специальности в группе ХОТЬ ЧТО-ТО понимают... эмм... ну, скажем, 17,5% (с калькулятором посчитал)) ). А я ваще довольно туповат, а в менеджеры/управленцы и т.п. не пойду. Душа блядь не лежит. Так че мне теперь, семью никогда не кормить? Половина же выйдет и станет чуть менее, чем средними специалистами с чуть более чем нормальным уровнем жизни. Из-за гордыни лишать людей жизни по-моему не хорошо.
            Даже для себя не буду разбираться, что из этого образно, а что про меня. Блять заткните меня я дохуя пизжу весь день жара ебаная достала
            Ответить
            • я поособому отношусь к людям с красным дипломом... так как вероятность что в их головах не окажется знаний довольно немалая (яб даже сказал огромна, а сразу выяснить это не получится, так как диплом красный)...
              знаю кучу примеров...
              Ответить
              • Хм. Ну просто я такого пока не встречал. эх.
                А что тогда показатель после выхода из инста? Вообще все теряется тогда... Я знаю зато нескольких людей, которые после девятого класса не учились вообще, но знают больше чем знают 99,(9)% всех человеков с в.о и п.к. (полными карманами), и работают они в таких местах где я вряд ли вообще побываю когда-либо.
                А универ закончить надо, в этом меня, к сожалению, не переубедишь.
                Короче, дайте мне мотиватор плиз.
                Ответить
                • нужны знания... причем не "просто слышал", а "знаю и использую"... ну и немного уверенности в себе, это нужно на собеседованиях, хотя новичкам это обычно мешает...
                  Ответить
                  • Я про институт конкретно, а не про работу/способность/качество работы. Я понимаю, что работа довольно редко связана с инстом, причем очень хорошо понимаю сейчас. Зачем мы тогда идем в вузі?
                    Ответить
                    • ну чему-то в институте всетаки учат...
                      Ответить
                      • Институты разные бывают, это во1. И, скорее всего я тебя немного огорчу, но многие из них довольно плохи. Первое, что приходит в голову, это пример: на Первом курсе мы пишем консольный im-клиент типа p2p, с поддержкой бесконечного количества клиентов, представляющих из себя клиентов и серверов одновременно, а на Третьем курсе другой человек пропихивает лабвью и логомиры.
                        Во2 тому, чему учат в институте учиться не обязательно, к моему сожалению и даже скорби.
                        Ответить
                      • 2Altravert:
                        если вы на 1м курсе изучали и писали p2p, - у вас двольно классный универ, я бы в таком хотел бы учиться;

                        за 3 года, у нас самым интересным заданием было: Написать программу рисования лабиринта с функцией поиска выхода -- банальная рекурсивная функция перебора ходов;
                        ---------------------------------------------
                        стимул: получить корочку в.о.
                        но это стимул просто закончить обучение в ВУЗе, и не уйти из него досрочно...

                        как говорил мой преп по вышке: "в вузе учить учиться! ну, по крайней мере, так должно быть..."
                        -- и правда, в вузе должны давать вектор обучения;

                        мне понравился стиль обучения одного препа:
                        "Вот задача (условие), срок: 2 дня"
                        далее идёт пара вводных слов про то для чего эта задача нужна и с какими проблемами можно столкнуться, но ни слова про способы решения этих проблем (максимум намёк какой-то)

                        и тут у тебя есть 3 пути:
                        - найти готовое решение (скучно)

                        - почитать литературу и написать решение за 1 час (сильно просто)

                        - попытаться самому чот придумать, опираясь на базовые знания языка (без какой-либо литературы)
                        ты тратишь пару часов на написание программы, в ходе тестирования натыкаешься на жука...
                        еще пару часов пытаешься его пофиксить: в итоге самостоятельно фиксишь этот баг
                        смотришь на код -- и тебе он кажется не красивым и ГК каким-то: тратишь еще пару часов на облагораживание...

                        и вот чудо: оно работает, и ты затратив 6 часов - решил задачу...

                        потом так, чисто для интереса открываешь книгу, и находишь там 3 функции из стандартной библиотеки, на написание и отладку которых у тебя ушло 6 часов...

                        и ты не понимаешь - смеяться или плакать... (вот оно! - этот путь по мне, ибо я сильно ленивый, чтобы открывать книжку)
                        ----------------------------------------------

                        зы: а вообще, обучаться нужно самостоятельно,- нужно разобраться, как и почему оно работает, ибо по-другому чему-то научиться невозможно;


                        ззы: стимул -- так же нужно определить самостоятельно ;-)
                        Ответить
                        • Ну, подчеркиваю, мы все таки писали IM. Также хочется застрить внимание что писал 1 человек. 1,5 если быть точнее. Мы не знали ни языков, ни алгоритмов, ни принципов: поставили задачу, а затем месяцы мозгоебства, пересдач чужого кода и всё такое. Мне повезло что я сравнительно быстро со всем этим разобрался. Притом препод явно преследовал личные цели: ему нужны были оригинальные исходники базового im клиента, о чем он проболтался. С тех пор кодить начали 2 человека из группы, один из них я. Мне говорят что теперь типа я больше всех в группе разбираюсь. Не знаю, сомневаюсь в этом, но то что кодером работаю я один -- это факт. Повторюсь, по специальности ("каким-то образом отноститься к компам" -- такая бля у нас специальность) чем-то заниматься могут несколько человек.
                          Насколько это хорошее образование?
                          И все таки только корочка выходит важна? Как доказательство усидчивости/везения/денег/задротства/зубрежки/жополизства (у кого что).
                          Ответить
                          • корочка нужна для понта, притом не тебе, а будущему начальнику.
                            чтобы он мог сказать: "наша команда состоит из первоклассных спецов, все они имеют в.о."

                            т.е. если ты талантлив и ты что-то умеешь делать хорошо -- тебя возьмут на работу.
                            но всёравно будут напрягать, чтобы получил В.О., - ибо: "у нас солидная контора, и нужно чтобы весь персонал (включая уборщицу) был с в.о."
                            Ответить
                            • Да, всё так получается. Видимо я правильно думаю.
                              Вата. Бесперспективненько.
                              Ответить
                            • в последний раз видел свой диплом, когда оформлялся на работу официально, при этом я проработал больше года и доработал до должности лида... с тех пор прошло 2,5 года... текущее руководство мой диплом не видело...
                              на собеседовании оконченное высшее является бонусом, так как оно свидетельствует о том, что человек может заставить делать себя то, что не хочет, а как известно даже в довольно интересном геймдеве есть очень много скучных задач... люди без ВО могут просто забить на все, как они это сделали в получая это самое ВО...
                              Красный диплом бонусом не является...
                              знаю кучу примеров...
                              Ответить
            • Точняк!
              Хорош гнать, надо искать нормальную работу, с кондиционером.
              У нас среди сотрудников такие настроения: «Блин, дома так гнусно, пойду на работу, там прохладно хоть»:)
              Ответить
              • Полгода во временном офисе((
                Седня гендир в 14:00: "Жарко седня, мы пошли, а вы на 2-3 часа пораньше домой идите". Через полчаса коммерческий "Всем на пляж! Это приказ! Всем пока!"
                Жара задрала
                Ответить
                • Да, тут народ даже от жары санпин повспоминал:) Там (по слухам) прогрессивно в зависимости от температуры предусматривается сокращение рабочего дня вплоть до нуля! Правда, одна закавыка, начальство должно это все официально и документально оформить.

                  PS. В Барселоне 30, поеду, нафик, туда!:)
                  Ответить
                • В Новосибирске седня +10 было
                  самое оно чтобы на пляж сдёрнуть ;P
                  Ответить
                • >Седня гендир в 14:00

                  гендир это социальный конструкт
                  Ответить

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