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

    +110

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    switch (x)
    if (z == 5)
    {
        case 10:
            y = 1;
    }
    else
    {
        case 11:
            if (z > 10)
                y = 2;
            else
            {
                default:
                    y = 3;
            }
    }

    Недавно показали вот такой вот switch.
    Первое, что пришло в голову: "wtf?! это ведь даже не скомпилится".
    Я оказался не прав.

    Запостил: govnopetya, 02 Ноября 2011

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

    • http://ideone.com/hN7Co
      и правда, wtf?
      Ответить
      • case и default - это label с некоторыми дополнительными ограничениями.
        Ответить
    • > Запостил: govnopetya
      http://govnokod.ru/8025
      неужели?
      Ответить
    • Минут 10 втыкал, так и не смог понять для чего этот макаронокод.
      Подождем-с Тараса с разоблачениями...
      Ответить
      • case это метки
        if там не работает, но если бы вместо не го был while было бы интереснее
        Ответить
        • Вроде как с кейзом был легальный способ перейти в середину конструкции. Забавная штука.
          Ответить
        • >но если бы вместо не го был while было бы интереснее
          Верно. Такие финты могут иногда помочь написать по-красивому вход в цикл, например, без goto и лишней логики.

          Хотя с другой стороны это может запутать код не хуже этого самого goto.
          Ответить
      • > Подождем-с Тараса с разоблачениями...
        в стиле СИШКОБЛЯДСКИЙ ПАРСЕР?
        Ответить
        • Угу. И с припиской, что в ПаскалеАде ТАК НЕЛЬЗЯ.
          Ответить
          • >в ПаскалеАде ТАК НЕЛЬЗЯ.
            Нельзя и не нужно.

            >в ПаскалеАде ТАК НЕЛЬЗЯ.
            Я не удивлюсь, если в аде есть корутины и там это будет вообще не нужно. Если через это эмулировать корутины в си, то получается не красиво и не потокобезопасно. В С++ просто не красиво.

            А разворачивание циклов нужно делать через шаблоны в С++. Хотя лучше это вообще не делать.
            Ответить
    • Случай default для x произойдет только при x = 11.
      Ну это ваще пушка.
      Ответить
      • > Случай default для x произойдет только при x = 11.
        Нет. Вот полностью эквивалентный switch:
        http://codepad.org/HaT8V4gN
        Ответить
    • хороший, годный говнокод
      его бы еще в одну строчку переписать
      Ответить
      • Хороший, говный код.
        y = x == 10 ? 1 : x == 11 ? z > 10 ? 2 : y : 3;
        Ответить
        • повышенная говтернистость
          Ответить
          • Через тернарность к компактному коду.
            y =
              x == 10
              ? 1
              : x == 11
                ? z > 10
                  ? 2
                  : y
                : 3;
            Ответить
            • чего не хватает в C, так это идеи "любая операция возвращает значение"
              (setf y
                    (cond
                     ((and (= x 10) (= z  5)) 1)
                     ((and (= x 11) (> z 10)) 2)
                     ((else 3)))
              Чтобы сделать код легко расширяемым, можно использовать более удобную структуру данных: ассоциации предиката и значения, которое ему соответствует. Такой код будет легко читать и расширять.
              Ответить
              • > чего не хватает в C, так это идеи "любая операция возвращает значение"
                Не очень ему это нужно. Однако для ценителей такого подхода есть тернарный оператор. Который некоторым почему-то очень не нравится.
                Ответить
                • зачем два оператора, когда можно обойтись одним if'ом? мне лично больше первый вариант нравится:
                  int i = if (x == 0) 1 else 3; // will not compile
                  int j = (x == 0) ? 1 : 3;
                  Ответить
              • >идеи "любая операция возвращает значение"
                Хорошая идея между прочим.
                Вот мне очень Nemerle из-за этого нравится. Да и не только этим он хорош.
                Жаль, что его делают по шарпоплатформу.
                Ответить
                • в Scala как в квази-функциональном языке это тоже работает
                  def abs(x: Int) = if (x < 0) - x else x
                  Ответить
                  • >квази-функциональном языке
                    Почему это скала квази-функциональный язык?
                    Ответить
                    • потому что Scala - гибридный язык
                      Ответить
                      • мультипарадигменный вы хотели сказать?
                        Ответить
                        • Нет, я хотел сказать, что Scala - гибридный язык
                          Ответить
                          • http://www.wikiznanie.ru/ru-wz/index.php/Гибридный_язык_программирования
                            С++\Object Pascal\Java тоже гибридные. Но это же не означает, что эти языки не ООП-языки. Так что скала вполне себе функциональный язык. Ну или приведите другие аргументы.
                            Ответить
                  • А try-catch тоже можно?
                    Ответить
                • Немерлисты давно грозятся сделать разные бэкенды. Сейчас начинают разработку Nemerle2, и там-то уж точно будет! :)
                  А вообще, всё упирается в средства. Либо нужно больше энтузиастов-профессионалов, либо просто деньги, на которые нанять этих профессионалов.
                  По подсчётам главного разработчика Немерла - VladD2 - нужно порядка одного миллиона баксов. Скинемся всем говнокодом?
                  Ответить
                  • > нужно порядка одного миллиона баксов
                    и будет построены нью-васюкинемерлы...
                    Ответить
                  • Знакомая сумма, где-то я это уже слышал… А, пионер Вася просил у Медведева на национальную ОС.
                    Ответить
                    • Магическое число. Когда бабаян сотоварищи просили денег на российский процессо𘙠нового поколения в далёком 98-м, божились, что им как раз миллиона долларов не хватает.
                      Ответить
              • >чего не хватает в C, так это идеи "любая операция возвращает значение"
                Согласен. Из-за такого недостатка и появляются костыли типа:
                http://govnokod.ru/8415
                Ответить
              • А ведь в Алголе (на который Си больше всего похож синтаксически), это уже было.

                Но если в Си даже передача структуры по значению проблемой была… Это всего лишь переносимый ассемблер.
                Ответить
    • На самом деле это вариация одной интересной идеи:
      http://en.wikipedia.org/wiki/Duff's_device
      Ответить
      • к разворачиванию циклов этот код отношения не имеет
        и принципы его здесь не используются

        используются свойства конструкции языка switch, но совершенно не по делу
        Ответить
        • спасибо, кэп
          Ответить
          • Duff's_device - метод ручного разворачивания циклов. к даному коду отношения не имеет
            Ответить
            • > вариация одной интересной идеи
              идея общая - оборачивать метки switch блоками, относящимися к другому оператору. Я не утверждаю, что код в топике хоть чем-то оправдан.
              Ответить
              • >идея общая
                В данном случае общей идеи никакой нет. Это всего лишь некорректное, в данном ГК, применение тонкостей стандарта языка. С каких пор читать стандарт - является общей интересной идеей?
                Ответить
    • перестал уважать C
      Ответить

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