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

    +92.9

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    string* newstr()
    {
        string* str;
        return memset(str=malloc(sizeof(string)), 0, str?sizeof(string):0);
    }

    Запостил: GovnocoderJr, 23 Января 2010

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

    • + добавка:
      string* append(string* dest, string const* src)
      {
      src->size?
      memcpy((char*)(dest->str=realloc(dest->str,dest->size+src->size+1))+dest->size,src->str,dest->str?src->size+1:0),
      dest->size+=(dest->str?src->size:-dest->size):0;
      return dest;
      }
      Ответить
      • умные сишники скажут, что у меня тут ошибка, даже 2, ошибки исправил, вот новая порция говна для размышлений (исправленная и дополненная)
        string* append(string* dest, string const* src)
        {
        char* realloc_ret;
        src->size?
        realloc_ret=realloc(dest->str,dest->size+src->size+1),
        memcpy(realloc_ret+dest->size,src->str,realloc_ret?src->size+1:(free(dest->str),0)),
        dest->str=realloc_ret,
        dest->size+=(realloc_ret?src->size:-dest->size):0;
        return dest;
        }
        Ответить
    • А что, порядок вычисления агрументов фунуции у нас уже гарантируется?
      Ответить
      • В си он справа налево, емнип.
        Ответить
        • Ошибаешься. В какой-то конкретной реализации, возможно. Но вот по стандарту С, в коде
          int i=5; myfunc(a,++a);
          не гарантируется что это будет аналогично myfunc(5,6) - компилятор может как бы сначала вычислить второй, и вызовется myfunc(6,6).
          Именно это называется кодом с побочными эффектами. Он зависит от компилятора, поэтому стал непереносимым.
          Ответить
          • Вообще-то "именно это" не называется кодом с побочными эффектами.
            Побочный эффект - любое изменение объекта непрописанное в контракте (возможно и неявном) метода.
            А этот код зависит от компилятора, только потому, что спецификация/стандарт С++ о таких случаях молчит
            Ответить
    • >sizeof(string)
      А string здесь что? Указатель на char?
      Ответить
      • Да по шарабану на что. Указатель он и есть указатель. Мне уже рассказывал раз друг как на собеседование пришел мужичок который тестовую задачу чего-то там сделать со строкой решал в виде
        for (i =0; i < sizeof(strptr); i++)
        :) так что нечему удивляться. такое сообразил выпускник Киевского Национального Университета факультета кибернетика... к чему образование катится...
        Ответить
        • А хотя... хотя... чем больше такой молодежи выпусщенной с гордым названием программист, тем более я останусь востребован даже в возрасте :) Не окажусь на обочине :)
          Ответить
      • Может это string - typedef массива?
        Ответить
        • А для массива sizeof(string) не вернул бы размер указателя или размер элемента?
          Ответить
          • Не вернул бы.
            Ответить
          • Более того, есть даже удобный способ определить размер (статически выделенного) массива на этапе компиляции: sizeof(arr)/sizeof(arr[0]).
            Ответить
    • Где здесь С++?
      Ответить

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