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

    +44.3

    1. 1
    while(*(++a)=*(++b));

    Краткость - сетра таланта.

    Запостил: Говногость, 02 Сентября 2009

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

    • Так ведь это норма для C++.
      Во всех учебниках так и делается копирование строк (ну, правда, a++ вместо ++a).
      Следовательно или это не говнокод или C++ говноязык (конечно это не говнокод :) )
      Ответить
      • код исключительно Сишный и под сишные строки
        Ответить
        • Код исключительно не безопасный.
          Ответить
          • ты дурак? где ты видел в сях исключительно безопасный код?
            Ответить
            • Ты ступил. "исключительно небезопасный" и "не исключительно безопасный" - разные вещи.
              Кроме исключительно небезопасного в сях иногда встречается просто небезопасный :)
              Ответить
    • Код, конечно, говно, но не потому, что слишком короткий. Короткий - хорошо, но вот постинкремент с преинкрементом путать не стоило бы.
      Ответить
    • Этот код (только с постинкрементом) я всегда привожу в качестве примера, как нельзя писать на C++. Пример очень яркий:
      1. К C++ имеет отношение, только если его рассматривать как наследник C.
      2. Почему вы решили, что это копирование строк? Может слонов. А может счетов пользователей.
      3. Что будет, если указатель нулевой?
      4. Как оценить размер буфера-приемника?
      ...
      можно продолжать и дальше, но лучше отправить читать Саттера, Александреску, Макконела
      Ответить
      • наверное круто городить из себя умного экстрасенса видя маленький кусочек программы?
        вот мой говнокод:
        a = b + 1;
        сколько тезисов сможешь привести почему так нельзя писать?

        по твоим недодумкам:
        1. чушь какую-то сказал
        2. а что ещё в сях имеет терминатор \0, сработающий как false? слоны, однозначно!
        3. а если пернуть на спичку, жопа загорится? автор к сожалению не догадался привести ещё пару десятков предшествующих строк.
        4. очередной вывод из воздуха
        Ответить
        • я конечно другой guest, но позволю себе не согласиться.
          consider this:

          class DerClass
          {
          public:
          ...
          operator bool () const { return false; }
          DerClass& operator = (DerClass const & rhs) { return *this;}
          DerClass& operator ++ () { return *this;}
          };

          void Uzhos(DerClass* a, DerClass* b)
          {
          while(*(++a)=*(++b));
          }
          Ответить
          • уважаемый, насрать таким образом и потом обвинять любую конструкцию в говнокодстве из-за того что он не содержит тонну параноидальных проверок, которые возможно попросту не нужны потому что такая логика, может каждый.
            Ответить
            • насрать-то можно по-всякому, ясное дело.
              оригинальный код я говном не считаю, кстати, просто тут почему-то многие уверены в том, что это сишный код и обязом строки и обязом копируются.
              Ответить
              • а ты категорию кода-то посмотрел или предполагаешь?
                Ответить
                • я посмотрел, но комменты говорят сами за себя

                  > код исключительно Сишный и под сишные строки
                  > ты дурак? где ты видел в сях исключительно безопасный код?
                  > а что ещё в сях имеет терминатор \0, сработающий как false? слоны, однозначно!
                  Ответить
        • Что Вы, "крутыми бывают лишь яйца". Я выражал свое мнение по-поводу приведенного фрагмента кода.
          По вашему фрагменту всего один совет - избегайте имен переменных оторванных от предметной области. Код, а не комментарии должны говорить о том, что Вы делаете.

          Дискутирование на тему окружаещего кода неуместно: вот тот пример, который я упоминал, полностью:
          void scopy(char* s1, char* s2)
          {
          while(*s1++=*s2++);
          }
          Авторский синтаксис сохранен.
          Ответить
          • А почему ты тогда постинкремент заменил на прединкремент? Получилось неправильно.
            Ответить
            • Ты имеешь ввиду в говнокоде? Это просто - не я его постил. Мой первый комментарий тут: http://govnokod.ru/1750#comment6518
              Ответить
    • Ну просто не крассиво. Уж лучше сделать это через memcpy или что-нибудь в таком духе.
      Ответить
      • Уж лучше на Ассемблере это сделать.
        Ответить
        • Вообще-то, если вы не знали, то memcpy может грубо говоря inline-уться, а если ещё длина - константа, то цикл может вообще полностью развернуться... к тому же бывают вариации опитимизрованного memcpy (например по-32-битовое копирование + хвост, вместо по-байтового).

          Проблема скорее в другом, данный алгоритм предполагает завершение по "\0" а не по длинне строки, поэтому memcpy() - не альтернатива, а альтернативой является что-нибудь вроде strcpy(). Но даже для strcpy() мои рассуждения выше верны.

          Да, я так и не понял, чем плох ассемблер?
          Ответить
          • Ассемблер рулит. С++ в топку. Я все пишу на асме.

            memcpy можно использовать так:
            memcpy(...,strlen(str),...);
            Ответить
          • Вообще-то, на РС memcpy не содержит циклов а использует значительно более эффективный rep movsx. А вот инлайнутся он как раз не может.
            Ответить
            • >rep movsx
              На новых компах сия команда работает много медленнее, чем цикл. Причина в том, что за счет предсказания ветвлений и возможности параллельного исполнения команд это работает быстрее, тк rep movsx не параллелиться с другими командами.
              Ответить
            • Я помню тестировал различные методы копирования строк, rep на моих компьютерах работает отвратительно медленно.

              А по поводу инлайнов, я говорю факт того, что у меня компилилось под netbsd с помощью gcc4
              Ответить
    • Я что-то туплю, но по-моему...

      *(++a)=*(++b)

      Это значит "Значение переменной, находящейся по адресу (а+1) увеличить в (b+1) раз" ...
      = *(++б)
      =* (++б)

      что из этого сработает, так сказать?
      Ответить
    • Ну Страуструп это приводит в качестве примера ХОРОШЕГО кода на С. Хотя, конечно, memcpy (strcpy) лучше.
      Ответить
      • Согласен, что strcpy лучше всего подходит, тк содержит оптимизацию на ассемблере... А тут ещё и не читабильно...
        Ответить
    • а чё, оч даже красиво вышло...
      Ответить

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