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

    +114

    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
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    #include <stdio.h>
         
        int main() {
            int i=5;
            switch ( 2 ) {
                case 0:
                    for (  i=0; i<10; i++ ) {
                case 1:
                    printf("A i=%d\n",i);
                case 2:
                    printf("B i*i=%d\n",i*i);
                    };
                case 3:
                    printf("done");
                    break;
            }
         
            return 0;
        }
         
        /* OUTPUT
        B i*i=25
        A i=6
        B i*i=36
        A i=7
        B i*i=49
        A i=8
        B i*i=64
        A i=9
        B i*i=81
        done
        */

    http://pastebin.com/EY3WQNzC - казехак.

    Запостил: serpinski, 06 Июня 2013

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

    • Прыжок внутрь цикла, пропуская инициализацию. Хорошо, хоть при попытке перепрыгнуть объявление переменной предупреждает.
      Ответить
      • > пропуская инициализацию
        Тут всего лишь присваивание пропустили, а инициализация была в строке 4.

        Кстати, в крестах, в отличие от сишки, пропускать инициализацию нельзя (но присваивание можно), и если в ветке свича нужна переменная, приходится делать лишний { дурацкий блок }.

        Ну и ссылка на тему: http://en.wikipedia.org/wiki/Duff%27s_device
        Ответить
    • показать все, что скрытоБЛЯДЬ, ЧТО ЭТО?????! Сишкобаш?
      Ответить
    • Да это же Бейсик!
      Ответить
      • Где здесь бейсики и баши? Самое обычное сишкоблядство, связанное с тем, что метки switch'а работают точно так же, как и обычные метки для goto.
        Ответить
        • >goto
          Поправлюсь: это не баш, это BAT.
          Ответить
        • Я сначала подумал, что сишка игнорирует структуру, как баши или старинные фортраны...

          Выходит, что метки не являются частью структуры, а если их удалить, то синтаксис (вложенность скобок и всё такое) должен сохраняться?
          Ответить
          • > метки не являются частью структуры
            Именно так.

            Весь switch это по сути один блок, на некоторые строки которого ссылаются метки, именно поэтому без бряка управление проваливается ниже, на следующие "ветви".

            Видимо изначально это был какой-то костыль, который несложно было реализовать при помощи do { } while, адресов меток и какой-то матери.
            Ответить
          • Какая жуть... Про бейсик было почти в точку:

            In the very very very old version of C language (think of the time dinosaurs roamed the Earth), known as "Reference Manual" version of C (which refers to a document written by Dennis Ritchie), labels formally had type "array of int", meaning that you could declare an int * variable
            int *target;
            and assign the address of label to that variable
            target = label; /* where `label` is some label */
            Later you could use that variable as the operand of goto statement
            goto target; /* jumps to label `label` */
            However, in ANSI C this feature was thrown out.
            Ответить
            • а что такого? Метка Адрес, указатель - Адрес, джамп отработет как треба.
              Ответить
              • То, что оно имело тип int *. Ну и адрес адресом, но это позволяло специально или случайно прыгать даже в середину другой процедуры... Мощный конечно прием, но очень опасный. Хотя в си все такое.
                Ответить
                • В середину другой процедуры — ерунда. Вот в середину инструкции — это класс! Нагляделся я на такое в исходниках рантайм-библиотек нашего любимого Борланда, где в порядке вещей были две функции с общим хвостом, причём первая начиналась с директивы db, так что начало второй функции было серединой процессорной инструкции. Надо было молиться, чтобы очередная версия Тасма скомпилировала код именно так, как ожидают разработчики.
                  Ответить
                • А ну это да, меня вообще нестрогая типизация в си смущает, я про то что с точки зрения процессорных команд все верно.
                  Ответить
            • target = label;
              target++;
              goto target;
              Ответить
          • показать все, что скрытоФортран, как я это уебище мог забыть. Кстати, там некоторые goto запрещены.
            Ответить
    • Ахтыжйобаныйтынахуй! О_О
      Ответить
    • Это хуже GOTO.
      Ответить

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