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

    +127

    1. 1
    (&goodsBuff[k].name==&vmass[p].name)

    Сравнение строк

    Запостил: GrayCardinal, 25 Октября 2010

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

    • Обычная ошибка начинающего
      Ответить
    • здесь более говниста строка mass в идентификаторе (который массив - К.О.)
      Ответить
    • Петросяны :)
      VM - Ass!
      По говнокоду: смеяться надо в условии, в том, что нету strcmp?
      Ответить
    • так трогательно, когда школьники называют переменные "massiv", "schetchik" итд.
      я сам так делал в 98м
      Ответить
    • До очевидного варианта - `vmass` обозначает "vertical mass" (вертикальная масса) - почему-то никто до сих пор не додумался. Любой мало-мальски образованный в области физики человек видя идентификатор `vmass` сразу думает о вертикальной массе :)
      Ответить
      • массу-то там видно, но масса - скаляр, вы случайно с весом не путаете?
        Ответить
      • Скажите, мало-мальски образованный в области физики человек, это где же это вы видели такой абсурдный термин "вертикальная масса" ?=)
        Ответить
        • вам срочно нужно приобрести детектор сарказма. он кстати с большой точностью измеряет массы. и вертикальную в том числе.
          Ответить
          • Ок, на говнокоде нужен смайлик с табличкой "Sarcasm".

            Хотя какая разница, все равно смысл комментов в том, чтобы разводить споры и холивары.
            Ответить
            • При этом в 90% случаем из-за того что не удалось отловить интонацию предыдущего оратора.
              Ответить
              • http://govnokod.ru/4456#comment50157
                Эти числа неспроста! Математика — великая вещь!
                Ответить
    • Интересно, а откуда ноги растут у такого кода? Если `name` - указатели или массивы, то типический чайник как правило реализует сравнение как `goodsBuff[k].name == vmass[p].name`, без использования оператора `&`. Код, разумеется, успешно компилируется и чайник до поры до времени не замечает подвоха.

      А здесь мы наблюдаем дополнительное использование оператора `&`. Зачем? Среднестатистический чайник до такого бы просто не додумался.

      В Си коде такое может быть оправдано, если каким-то образом массивы `goodsBuff[]` и `vmass[]` перекрываются (это могут быть указатели в один и тот же массив) и автор просто хотел отловить возможный факт того, что `goodsBuff[k].name` и `vmass[p].name` - один и тот же объект. (В С++ коде возмрожна еще попытка проверки того, что ссылки `name` указывают на один и тот же объект).
      Ответить
      • Всё о чём вы здесь говорите относительно оправдания кода, я, более чем уверен, в голову автора не попадало вообще. & для массива опускается компиляторами (не знаю на счет всех, но в некоторых точно). А зачем присутствует в коде? Да потому что это крутой значок :)
        Ответить
        • найди мне компилятор, который будет вылетать на ассерте
          {
          char p[16];
          assert(&p[0] == p);
          }
          Ответить
        • "& для массива опускается компиляторами" - откуда это? Оператор `&`, будучи примененным к массиву, компиляторами никогда не опускается. Результат такого `&` численно будет совпадать с адресом первого элемента массива, но тип этого результата будет "указатель на массив", а не "указатель на элемент". Т.е. эффект оператора `&`, примененного к массиву, существует, но существует он только на уровне понятий языка ("тип указателя") и в сгенерированном машинном коде сам по себе не отражается. (Это, наверное, можно ошибочно принять за опускание).
          Ответить
          • Про тип согласен. Но в ГК же не типы сравниваются, а значения. С другой стороны - код-то сишный. Как в Си тип проверять будете?
            Ответить

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