Няшная / Говнокод #8397 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 govnopetya, (Updated )

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

    • case и default - это label с некоторыми дополнительными ограничениями.
      Ответить
  • Минут 10 втыкал, так и не смог понять для чего этот макаронокод.
    Подождем-с Тараса с разоблачениями...
    Ответить
    • case это метки
      if там не работает, но если бы вместо не го был while было бы интереснее
      Ответить
      • Вроде как с кейзом был легальный способ перейти в середину конструкции. Забавная штука.
        Ответить
      • >но если бы вместо не го был while было бы интереснее
        Верно. Такие финты могут иногда помочь написать по-красивому вход в цикл, например, без goto и лишней логики.

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

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

          А разворачивание циклов нужно делать через шаблоны в С++. Хотя лучше это вообще не делать.
          Ответить
  • Случай default для x произойдет только при x = 11.
    Ну это ваще пушка.
    Ответить
        • Через тернарность к компактному коду.
          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
                Ответить
              • Немерлисты давно грозятся сделать разные бэкенды. Сейчас начинают разработку Nemerle2, и там-то уж точно будет! 🙂
                А вообще, всё упирается в средства. Либо нужно больше энтузиастов-профессионалов, либо просто деньги, на которые нанять этих профессионалов.
                По подсчётам главного разработчика Немерла - VladD2 - нужно порядка одного миллиона баксов. Скинемся всем говнокодом?
                Ответить
                • > нужно порядка одного миллиона баксов
                  и будет построены нью-васюкинемерлы...
                  Ответить
                • Знакомая сумма, где-то я это уже слышал… А, пионер Вася просил у Медведева на национальную ОС.
                  Ответить
            • >чего не хватает в C, так это идеи "любая операция возвращает значение"
              Согласен. Из-за такого недостатка и появляются костыли типа:
              http://govnokod.ru/8415
              Ответить
            • А ведь в Алголе (на который Си больше всего похож синтаксически), это уже было.

              Но если в Си даже передача структуры по значению проблемой была… Это всего лишь переносимый ассемблер.
              Ответить
    • к разворачиванию циклов этот код отношения не имеет
      и принципы его здесь не используются

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

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8