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

    +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
    #define N2(n)   #n"0",#n"1",#n"2",#n"3",#n"4",#n"5",#n"6",#n"7",#n"8",#n"9"
    #define N30(n)  #n N2(),#n N2(1),#n N2(2),#n N2(3),#n N2(4),#n N2(5),#n N2(6),#n N2(7),#n N2(8),#n N2(9)
    #define N3(n,k) #n#k"0",#n#k"1",#n#k"2",#n#k"3",#n#k"4",#n#k"5",#n#k"6",#n#k"7",#n#k"8",#n#k"9"
    #define N4(k)   N3(k,0),N3(k,1),N3(k,2),N3(k,3),N3(k,4),N3(k,5),N3(k,6),N3(k,7),N3(k,8),N3(k,9)
    #define N5      N30(),N4(1),N4(2),N4(3),N4(4),N4(5),N4(6),N4(7),N4(8),N4(9)
    
    const char s[][4]={N5};
    const int s_size = sizeof(s)/sizeof(s[0]);
    void print_number(int n) {
        if (n<s_size) {
            printf("!%s\n",s[n]);
        }
        else {
            printf("?%d\n",n);
        }
    }

    Отсылка к #3376 http://govnokod.ru/3376
    Вопрос к общественности: что бОльший говнокод, >100 строк строковых констант или 5-строчный пассаж на макросах?

    Запостил: xredor, 19 Февраля 2011

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

    • показать все, что скрыточто это делает?

      Ахахаха, вам пришлось лепить уродливый макрос N30, из-за того, что этот мудак Ритчи сделал числа на 0 восьмеричными!!!!
      Ответить
      • Несвязанный поток слов?
        Ответить
        • Объясняю: чтобы сгенерировать перечисление
          "000", "001", "002", ..., "099", "100", ..., "999", можно составить намного более простой макрос. Но лидирующий ноль в СИ меняет смысл числа, такой вот уродливый костыль
          Ответить
          • макро-ориентированное программирование какое-то.
            кстати, не только в Си
            Ответить
          • Более читабельные альтернативы всегда есть.
            Это в любом случае говнокод, которого можно было избежать.
            Ответить
          • Во-первых: в примере выводятся строки, и совершенно не важно скольки -ичное этой строкой представляется число.
            Во-вторых: даже если нужно преобразовать строку в число, всегда есть возможность указать формат %d, %o, %x и т.д.
            Ответить
      • основание системы счисления совпадает с количество хватательных конечностей у Ритчи и Кернигана...
        случайно ли это?
        Ответить
    • Лучше - познакомиться с циклами.
      Ответить
    • мне это нравится больше...
      Ответить
    • > что бОльший говнокод, >100 строк строковых констант или 5-строчный пассаж на макросах?

      5-ти строчная маструбация макросов само собой разумеется большее ГК.

      100+ строк констант генерятся тривиальной программой - сырец которую можно включить внутри комментария к файлу. (для юнихов: "геренерятся одной строкой в шелле".)

      а вот те 5 строк..... я думаю их написать и протестировать понадобилось на порядок больше времени.
      Ответить
      • О, да, пришлось постараться.
        Есть еще вариант проинициализировать массив при запуске программы, но мороз по коже пробегает от мысли о микроватт-секундах, которые будут на это тратится при каждом запуске. Кроме того, на Си статическую инициализацию красиво сделать не получится.
        Ответить
        • > но мороз по коже пробегает от мысли о микроватт-секундах, которые будут на это тратится при каждом запуске

          пусть тебя утешает то что на С++ это все еще хуже ;)

          в С++ не только время на старте -для инициализации статических объектов- тратится, но так же еще и время при завершении программы - на вызовы всех деструкторов.
          Ответить
      • Зачем константы?

        printf("!%d\n",n);
        Ответить
        • Вообще, для оптимизации. Но пост не о целесообразности такой оптимизации. Это обсуждалось в #3376. А о том, как можно извратиться макросами и обойтись без генератора кода.
          Ответить
          • > как можно извратиться макросами и обойтись без генератора кода.

            1. если Винды или Жаба. программы перезапускаются редко - т.к. традиционно создание нового процесса относительно медленно - используй программную инициализацию: цикл где в начале встраиваешь (например в красивый объект завернутый) и забывашь про него.

            2. если Линухи/Юнихи. не еби людям мозги. естче наши духовные лидеры товарищи Денис/Ритчи завещали, что надо учится не просто писать программы, а писать программы которые будут писать программы для нас. и мля сгенерировать такой файл можно либо внешним скриптом либо прямо в Makefile'е. пять минут и готово.
            Ответить
    • На С++ можно было-бы через метапрограммирование все это реализовать на этапе компиляции, но это Си...
      Ответить

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