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

    +911

    1. 1
    case UP : o > 0 ? o-- : o = FIELD_SIZE - 1; break;

    Друг скинул в аську, попросил перевести в if-ную форму)))
    Не знаю где он это откопал)))

    Запостил: k06a, 26 Апреля 2010

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

    • Школьники, да.
      Ответить
    • Не похоже, что писали школьники.
      Друг привод в нормальный вид код из примеров Матлаба))
      Хотя хрен знает кто у них там работает)))
      Ответить
    • в чем говнокод?
      Ответить
      • То есть код прозрачен для понимания? (скобки не нужны??)
        Я подумал что этот код эквивалентен:
        // case UP : (o > 0 ? o-- : o) = FIELD_SIZE - 1; break;
        case UP:
        if (o > 0) o--;
        o = FIELD_SIZE - 1;
        break;
        Был не прав.
        Ответить
        • Ведь (o--) не даёт (int&), как хотелось бы . . .
          Значит у тернарного оператора наименьший приоритет . . .
          Ответить
          • ну, как по мне, код абсолютно прозрачен. причем здесь (int &)? в чем вообще проблема?
            Ответить
    • код уродский(переменная с названием "о" чего стоит), тетрарный оператор нужен для возвращения значения, а не выполнения присванивания внутри него

      if(o > 0)
      o--;
      else
      o = FIELD_SIZE - 1;
      break;

      ну либо
      o = o > 0 ?o - 1 : FIELD_SIZE - 1;
      Ответить
      • Второй вариант верен, он же:
        case UP:
        if (o > 0) o--;
        else o = FIELD_SIZE - 1;
        break;
        Ответить
    • код так-то норм, всё понятно, хотя компилер вроде бы должен дать ворнинг что-то типа empty statement...

      но орфомление понравилось, как будто полоса смайлов

      а лучше как-то так:
      case UP 	:o 	>0 	?o--:o 	= FIELD_SIZE - 1; break;
      Ответить
    • Код совершенно прозрачный и ясный для понимания.
      Не вижу говна.
      Ответить
      • Прозрачность для понимания не исключает говнистость.
        Ответить
        • Чувачёк с розовыми волосиками? Типичный С++ник-пидораст-задрот.
          Ответить
          • Скажи, омич, ты упоротый чтоле? Где ты там розовые волосы увидел? Скажи, я тоже хочу таким упарываться.
            Ответить
            • Походу он дальтоник... :D
              Ответить
            • Они зеленые! Все дело в волшебных пузырьках Юзайте прафильные ICC-профили:)
              Ответить
    • Кстати, что будет работать быстрее, ветвление или деление по модулю FIELD_SIZE?
      Ответить
    • Где здесь С++?
      Ответить
    • Честно говоря, я не понял в чём дерьмистость кода. Замена кода на код, с использованием if приведёт к неэквивалентному случаю. Я думаю это и так все понимают, но если вдруг есть люди, которые не верят, советую скомпилить оба случая и продизассемблировать.

      Вполне читаемый, нормально работающий и вполне оптимальный код...

      Знаю, что многие за этот пост начнут минусовать. Но прошу рядом с каждым минусом давать аргументированный ответ.
      Ответить
      • файлы идентичные кроме 1 строки
        1.c:
        o > 0 ? o-- : o = FIELD_SIZE - 1;

        2.c:
        if (o > 0) o--; else o = FIELD_SIZE - 1;

        totalwar@deb:/tmp$ gcc -S 1/1.c
        totalwar@deb:/tmp$ gcc -S 2/1.c -o 2.s
        totalwar@deb:/tmp$ diff -s 1.s 2.s
        Файлы 1.s и 2.s идентичны

        ч.т.д.
        Ответить
        • WTF?
          Ответить
        • Ну во-первых, как это делает изначальный код говном?
          А во-вторых, что произошло с "set"? Может вы забыли указить "volatile" и у вас тупо код соптимизировался в обоих случаях до программы-пустышки?

          И какая у вас версия "gcc", что он воспринял строку "o > 0 ? o-- : o = FIELD_SIZE - 1;"? У меня лично, данная строка воспринимается только в "g++".
          Ответить
          • warning: use of conditional expressions as lvalues is deprecated
            error: invalid lvalue in assignment
            (3.4.5 и 4.4.3)
            Ответить
          • глянул сорцы, оказывается там
            o > 0 ? o-- : (o = FIELD_SIZE - 1);
            но в этом контексте все равно if и тернарный ведут себя одинаково
            Ответить
            • Хм. Может быть вы и правы, конструкция, всё-таки необычная. А сделана она, вероятно, чтобы просто в одну строку упихать один "case".
              Ответить
    • Вы все хуй!
      Ответить

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