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

    +136

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    void ps(const char *a)
    {/*means putstring*/
    	for(; '\0' != *a; a++)
    		putchar(' ' != *a ? *a : (putchar('\n'),'\t'));
    }

    Как-то ночью, в час унылый, в голове собрав все силы,
    Разум темный, как могила, начал свой хромой закон.
    Начиная выражаться, а точнее проявляться,
    В мир безбрежный и зеленый, зло построило свой ход:
    Пальцы тонкие и злые, подчиняясь темной силе,
    Выхватив перо в чернилах, вывели сей говногод.

    Запостил: ntfshard, 18 Апреля 2013

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

    • '\0' != *a


      это ГК в ГК. если бы просто `*a` было, то было бы законченное, совершенное ГК.
      Ответить
      • > если бы просто `*a` было
        Так тут проверяют не то, что *a не нулевое, а то, что не испортился ноль в '\0'.
        Ответить
        • Если моя память не спит с другим, разве ANSI C гарантирует, что '\0' == 0x0 ?
          Ответить
          • Ну C89+, если мне не изменяет память, вполне так гарантирует. А спеки ниже С89 никого сейчас не интересуют, хотя и там это должно быть гарантировано.
            Ответить
    • У меня только один вопрос - почему автор так ненавидит if и while?
      Ответить
      • Циклы while не использую. А к if'ом отношусь нормально. Точнее я, как гуманоид, к ним не отношусь, но считаю хорошим, годным и полезным инструментом.

        PS код использовался для печати фич OpenGL. Чтобы не подряд, а в столбик да с отступом. >_<
        Ответить
        • > Циклы while не использую.
          Из религиозных соображений или что-то объективное?

          > но считаю хорошим, годным и полезным инструментом.
          Тогда зачем тернарник с побочным эффектом вместо простого и понятного if'а?

          А первый отступ выводится отдельно? Или в строку добавляете лишний пробел?
          Ответить
          • Просто мне проще писать фор. Привычка.

            Эм.. мы тут о говнокодах говорим? Хуже это лучше, разве не так?

            А первый идет лесом, то есть без отступа. =__=' Я раньше об этом даже не задумывался. Точнее сказать, когда просто хочешь увидеть список (ради великого интереса), не паришься. Пусть будет так (вот и плюс for'а, по отношению к while):

            some codevoid ps(const char *a)
            {/*means putstring*/
            	for(putchar('\t'); '\0' != *a; a++)
            		putchar(' ' != *a ? *a : (putchar('\n'),'\t'));
            }
            Ответить
            • > Эм.. мы тут о говнокодах говорим? Хуже это лучше, разве не так?
              Ну да, для говнокода то тут все условия выполнены ;)

              На говнокод и одного тернарника с побочным эффектом хватило бы... Но здесь даже никому не нужный в наши годы йода-стайл '\0' != *a имеется, хотя любой мало-мальски адекватный компилятор ругается на = вместо == в условиях ифа фора и вайла...

              Кстати, без каких-либо проблем работало бы и простое *a ;)

              > плюс for'а, по отношению к while
              О_о. А перед while() этот putchar я бы поместить никак не смог...

              > плюс for'а, по отношению к while
              А ну да, для создания запутанных однострочников этот плюс безусловен.
              Ответить
              • Вспомнилась история: моему знакомому(Хай, Грифон!), при приеме на работу интерном-программистом сказали что *а ==0 не канонiчно. Но смысл даже не в этой притче.

                ИМХО, *a немного заставляет вспомнить, же у нас в а. А если это указатель на указатель? Не суть.. Важно, что в конце концов это один и тот же код в асме, с похожими записями на си. Но код пишем для людей, не для машин.
                Каждый выбирает по себе.

                >> мало-мальски адекватный компилятор ругается на = вместо == в условиях ифа фора и вайла...
                Я разве спорю? Но вот на компилятор надейся, а сам не плошай. Не всегда можно заметить варнинг. Ну замылился глаз к вечеру - сидишь и не видишь баги.
                Да и мало ли на чем писать приходится. К примеру, скриптовые языки, как то темный ПХП. (темный ибо нефига не видно >_<, и чуть чаще, чем всегда говнокод).

                > О_о. А перед while() этот putchar я бы поместить никак не смог...
                А почему нет? Можно и туда. Я вот только никак не пойму, вы почему так за вайл переживаете? Это же тоже дело привычки (ну или условий оформления кода в проекте). Я помню, что был какой-то программист старой школы, который говорил, что цикл for - избыточный и while может всё. Точно не помню по поводу какого языка, но это было очень давно.
                Ответить
                • > заставляет вспомнить, же у нас в а. А если это указатель на указатель?
                  Да на самом деле не суть. for (; *a; ++a) это известная идиома обхода null-terminated массива. И для ее понимания совсем не важен тип элемента ;)
                  Ответить
                  • Согласен. Суть только в том, для чего этот код, в плане какой проект и какова жизнь этого куска кода.
                    Ответить

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