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

    +143

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    switch (options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))
      {
      case 0:
      case PCRE_BSR_ANYCRLF:
      case PCRE_BSR_UNICODE:
      break;
      default: errorcode = ERR56; goto PCRE_EARLY_ERROR_RETURN;
      }

    Выкидываем три варианта, обрабатываем один.

    Запостил: blueboar2, 06 Июня 2011

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

    • Логика автора:
      1. 0 - похуй
      2. PCRE_BSR_ANYCRLF - похуй
      3. PCRE_BSR_UNICODE - похуй
      4. errorcode = ERR56 - йоба!
      Ответить
    • > Выкидываем три варианта, обрабатываем один.

      По-моему наоборот, идём дальше по 3 вариантам и вылетаем на PCRE_BSR_ANYCRLF & PCRE_BSR_UNICODE, хотя нафиг тогда свитч.
      Ответить
      • есть народ который предпочитает писать так вместо простого if.

        и если перепесать на if, то будет нужно доп переменная (что бы три раза значение не вычислять). может потому что не хотели еще одну временную переменную вводить вот так и написали.
        Ответить
        • Зачем переменная?

          if options | PCRE_BSR_ANYCRLF | PCRE_BSR_UNICODE = options then ... error ...
          Ответить
          • проверка проверяет что только один из флагов установлен, либо они не установлены вообще. поэтому if'ом это как минимум три проверки на `(options & (PCRE_BSR_ANYCRLF|PCRE_BSR_UNICODE))`: `== 0`, `== PCRE_BSR_ANYCRLF` и `== PCRE_BSR_UNICODE`. поэтому, либо три раза копипаст, либо временная перемення.
            Ответить
            • Да, но если один или ни одного он же ничего не делает. break - и идет дальше. Поэтому эти проверки можно собсно и вообще выкинуть.
              Ответить
              • > Да, но если один или ни одного он же ничего не делает.

                пойдите, выпейте кофе - вы еще видно не проснулись.

                Естественно что код *что то* делает в этом случае, а именно *не* обламывается по ошибке.
                Ответить
                • Еще раз.
                  Если ни одного флага - идем в свич, на первом case выходим из свича идем дальше. Ничего не произошло.
                  Если один флаг - идем в свич, на втором-третьем case выходим. Ничего не произошло.
                  Если два флага - идем в свич, на третьем case вываливаемся в ошибку.

                  Вот и предлагаю if (условие третьего case) --> ошибка
                  Ответить
      • PCRE_BSR_ANYCRLF & PCRE_BSR_UNICODE = 0
        Ответить
        • Эм. Оно всегда равно нулю. Это же две битовых константы.
          Ответить
    • > goto
      поубивал бы
      Ответить
      • Си - это же такой переносимый ассемблер. Ассемблер без переходов - не ассемблер. Не?
        Ответить
        • к Си у меня претензий нет, автора вина, что у него ветви логики такие длинные и запутанные.
          Ответить
          • как по мне, умеренное и осмысленное применение goto лучше чем кучи вложеных if'ов/етц.
            Ответить
            • не одними ифами... есть много средств, что бы держать код в чистоте и ясности
              Ответить
              • ты хочешь сказать что if'ами/while'ами/етц невозможно сделать запутанный и нечитабельный код?

                я конечно избалован работой с некоторыми крутыми опенсорсными проектами, но я видел кучи уродливого (коммерческого) кода без goto - и кучи читабельного читабельного (open source, cue: linux kernel) кода с goto. я естественно предпочитаю последнее.
                Ответить
    • это "рога" после реинженеринга остались? уж больно уродливо выглядит.
      Ответить
    • Кренделя бля тут выкидывают, а не варианты.
      Ответить
    • показать все, что скрытоvanished
      Ответить

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