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

    +141

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    int main()
      {
        int i = 0;
        goto A;
        for (;i<3; ++i)
        L:{
            {
              int x;
              x += i;
              if (0) { A: x = 0; goto B; }
              printf("X: %d ",x);
            }
            {
              int y;
              y -= i;
              if (0) { B: y = 10; goto L; }
              printf("Y: %d\n",y);
            }
          }
      }

    Отсюда: http://rsdn.ru/forum/cpp/4812647.flat.aspx Автор походу уверен в гениальности кода.

    Запостил: slavap, 10 Июля 2012

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

    • Так гениально же!
      Ответить
      • Это зашифрованое послание, нужно читать с пятой строчки 12-го символа:
        I <3 ++

        ну или как-то так.
        Ответить
    • Зачем?
      Ответить
      • Что бы все охуели как он умеет.
        Ответить
        • Тогда он выбрал подходящий язык. Потом пусть перейдёт на плюсы.

          А прыжок в точку, находящуюся после инициализации переменной, но в её зоне видимости, разве разрешается? Кресты вот запрещают.
          Ответить
          • C++98. 6.7 Declaration statement

            It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A pro-
            gram that jumps77) from a point where a local variable with automatic storage duration is not in scope to a
            point where it is in scope is ill-formed unless the variable has POD type (3.9) and is declared without an
            initializer (8.5)


            Получается, что впрыгнуть в блок можно даже в крестах, но только тогда, когда мы не пропускаем инициализацию переменных. Т.е. в данном случае все ок.
            Ответить
            • fix: не пропускаем инициализацию POD переменных
              в с++03 пункт слово в слово

              в с++11 дополнили:
              It is possible to transfer into a block, but not in a way that bypasses declarations with initialization. A
              program that jumps from a point where a variable with automatic storage duration is not in scope to a
              point where it is in scope is ill-formed unless the variable has scalar type, class type with a trivial default
              constructor and a trivial destructor, a cv-qualified version of one of these types, or an array of one of the
              preceding types and is declared without an initializer
              Ответить
              • Да и пофиг, зачем вообще такие прыжки нужны.
                Это только в свиче парит, приходится лишние фигрные скобочки ставить, потому что логика свича идиотская, и она же перешла блин во все жабошарпы.
                Ответить
                • Угу, не протекали бы ветки свича без break, не нужно было бы париться - в каждой ветке был бы просто свой локальный скоп... Кому надо протекание - добавил бы goto на следующую ветку. В конце концов это нужно не так часто.

                  switch, имхо, неудачная конструкция. Паскалевский case удобнее.
                  Ответить
                  • Адский, кстати, ещё чуть лучше - если между ветками нужен не один оператор, а несколько, то нет необходимости ставить лишнюю пару операторных скобок между метками. Метки веток сами работают как границы блока.
                    Ответить
                    • Ну, имхо, надо было как-то так
                      switch (x) {
                      case 1,2,3:
                          int p = foo();
                          int q = bar();
                      case 5:
                          int p = another_foo();
                      default:
                          int ppp = qqq();
                      }

                      > Метки веток сами работают как границы блока.
                      Именно. И у каждой ветки свой скоп, независимый от других.
                      Ответить
                      • Да, примерно так. Ну и понятно, с возможностью указывать диапазоны и перечисления в метках.
                        А, ещё если в метках упомянуты не все значения перечислимого типа, то ветка default (называется others правда) обязательна.
                        Ответить
                        • > если в метках упомянуты не все значения перечислимого типа
                          Ну на это, слава богу, и gcc ругаться умеет (опция -Wswitch, входит в -Wall). Спорно конечно, но имхо лучше ошибка/ворнинг, чем забытая ветка в свиче, когда я добавлю новое значение в enum.
                          Ответить
                          • Ну да, только в Аде это не предупреждение одного компилятора, а требование синтаксиса, указанное в стандарте.
                            Правда это не спасает, если есть заглушка
                            when others => null
                            (default : {} то бишь)
                            Ответить
                            • Вот в чем плюс такого предупреждения\ошибки - так это в том, что оно заставляет задуматься, что же мы хотим от свича.

                              Если я хочу обработать вот это, вот это и вот это, а для всех остальных значений, включая будущие ничего не делать - я вставлю заглушку в default.

                              Если же нужно обработать вот это, вот это и вот это, при остальных имеющихся значениях ничего не делать, а что делать с будущими - хбз, то я вместо заглушки с default напишу пустышки с каждым из оставшихся вариантов. И тогда компилятор предупредит меня, если я добавлю новое значение в енум, но забуду внести его в свитч...

                              > предупреждение одного компилятора
                              Ну мне кажется все вменяемые компиляторы с\с++ его умеют выдавать.
                              Ответить
                              • 2003я студияна в4 молчит кстати
                                Ответить
                                • > 2003я студия на в4 молчит кстати

                                  А я же, между прочим, не зря писал про вменяемые компиляторы...
                                  Ответить
            • Нет, не ок, метка А находится после инициализации х, но в её зоне видимости.
              Ответить
              • bypasses declarations with initialization

                Под инициализацией там понимается именно int x = 2; а не int x; x = 2; Во втором случае все ок.

                P.S. Ну да, на русский я очень вольно перевел, сорри.
                Ответить
          • > Тогда он выбрал подходящий язык.
            Нет. Чтобы все охуели - нужен хаскель.
            Ответить
            • Он недостаточно кулхацкерен и байтоебабелен.
              Ответить
            • Нужен J.
              Ответить
              • Я бы решил задачу из топика так (все равно тут никто не знает J и не проверит):
                {+*32[dds[]n&%+ds32]#!{42%$#*+23{100500
                Ответить
                • Неплохое решение, но я бы сделал так:
                  --11/)[p[f]7 &&&)p?< >> 90:d UU -(} $ [#\/!!]
                  Ответить
                  • +.7[!
                    Кто меньше?
                    Ответить
                  • J - это как хеш? Даже малое изменение приводит к полной смене облика кода?
                    Ответить
                    • Нет. Он просто write-only. Проще переписать фрагмент, нежели исправлять его...
                      Ответить
    • Дейкстра всегда говорил - goto не нужен.
      Ответить
      • goto всегда говорил - Дейкстра не нужен.
        Ответить
        • goto hell
          Ответить
        • я не верю goto - он всегда далеко посылает.
          другое дело jmp far - c ним учишься прыгать далеко.
          Ответить
          • Goto - всегда постоянный, всегда безусловный и неоригинальный.

            То ли дело j(x)!

            ja, jna, jae, jnae, jb, jbe, jnb, jnbe, jo, jno, jz, je, jnz, jne, jc, jnc, jp, jnp, jg, jl, jge, jle, jng, jnge, jle, jnle.

            И это я ещё половину забыл.
            Ответить
    • Безусловный переход шикарен.
      Ответить

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