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

    +165

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    8. 8
    if ( p->m_p ) 
    {
          m_p = p->m_p;
    }
    else 
    {
          m_p = NULL;
    }

    Мля, ну а вдруг

    Запостил: J0hnny, 02 Сентября 2010

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

    • linked list, не?
      Ответить
      • нет, это часть кода копирующего конструктора
        Ответить
        • Часть кода копирующего конструктора и p является указателем, эт шо за маразм?
          Ответить
          • Согласен. Поверхностное копирование и копирующим конструктором, предоставленным системой хорошо работает.
            Ответить
          • Да, это не true C++ копирующий конструктор
            Ответить
    • ну я на самом деле встречал пару людей которые думали что "if (pointer)" это есть проверка на валидность указателя. а NULL это всего лишь стандартный невалидный поинтер.

      я такое говном в общем случае не назову, потому что часто бывает что в коде сам так делаю когда в else ветке планируется что-то добавить или было что-то убрано но может опять появится. постоянно те `if () {} else {}` добавлять/удалять достает.

      и еще одно реальное применение: место для брекпоинта по условию что p->m_p есть NULL.
      Ответить
      • Да, согласен, с оговорками это не 100% говнокод.
        Но если без оговорок про брейкпоинты и добавочный код, говно ли это?
        Ответить
        • эффект негативный такая практика будет иметь если народ таким делом весь код засрет.

          или p->m_p в принципе NULL быть не может :)
          Ответить
          • assert() на что?

            и да это банальное говнецо какое-то. даже не смешно
            Ответить
      • >>которые думали что "if (pointer)" это есть проверка на валидность указателя
        может быть они были PHPшники?
        там так можно делать. Не валидность конечно проверять, а на нул проверять
        Ответить
        • На нул оно так в любом языке проверяется.
          Ответить
          • ни в java ни в .net такое не прокатит, ибо pointer -- это не всегда выражение типа булен, и к булену не кастица.

            кстати и в борланд паскале такое не сработает (за дельфи не скажу)
            Ответить
            • сработает
              if LongBool(PStruc) then
                if PStruc^.Size > 0 then { никогда не упадет }
              Ответить
              • мы говорили о if (PStruct). где PStruct -- поинтер. Разве сработает?
                Ответить
                • Покайтесь, вы впадаете в ересь слабой типизации.
                  Как может сработать указатель там, где ожидается логический тип?
                  Ответить
                  • Путем неявного преобразования.
                    Хотя, по-моему, вы уже не С/С++ обсуждаете.
                    Ответить
                  • Указатель один хрен цифра. Ты же его складывать можешь? И с цифрой, и с другим. Насчет приведения 0 к false ты же не поспоришь? Или !0 писать тоже нельзя?
                    Ответить
                    • В Паскале, на который кивал Анонимус (и заметил только absolut), так делать нельзя. Складывать указатели тоже нельзя без ключика компилятора или тайпкастов. Добро пожаловать в мир строгой типизации.

                      Ты путаешь число и цифру, кстати, разные типы же :)
                      Ответить
                      • Стоит начать с того, что я не в теме, как оно в паскале, это во1. А во2 я проебал место, где мы на него перешли))
                        Да и цифра не тип тогда..
                        Ответить
                  • такт таки я и говорю что не сработает
                    Ответить
                  • >>Как может сработать указатель там, где ожидается логический тип?
                    тото.
                    В языках с жетской статической типизацией такое не прокатит.
                    Мне кажется что паскаль как раз из таких был.
                    Ответить
            • Да, надо влепить одну ретипизацию, то есть прямо сказать компилятору, что я тут имею в виду. В Дельфах с этим строго, зато облажаться сложнее.
              Ответить
      • > и еще одно реальное применение: место для брекпоинта по условию что p->m_p есть NULL.

        br <line> if p->m_p == 0
        ?
        Ответить
        • ... и можно на полдня уходить пить кофе, ибо тормозить будет по черному. Нет, если нужен условный брейкпоинт, то лучше вписать в код явную ветку и поставить туда безусловный брейк. Правда строить весь свой код вокруг это идеи - бред. Поэтому вышепроцитированное - говнокод.
          Ответить

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