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

    +166

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    #include <iostream>
    using namespace std;
    
    int main () {
      for( struct {int i; long i2;} x = {1, 1};
           x.i2 <= 100;
           x.i++, x.i2 = x.i * x.i ) {
        cout << x.i2 << endl;
      }
      return 0;
    }

    Поскольку реального ГК нет, добавлю синтетического.
    NB: Под MSVC такое не пройдет. g++ - ok: http://codepad.org/JesKsnMQ

    http://jia3ep.blogspot.com/2010/07/struct-in-for-loop.html

    Запостил: Aleskey, 04 Июля 2011

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

    • Синтетического? Тогда нахуй
      Ответить
      • Да нет, всё отлично. Подобное не каждый день встречаешь!
        Ответить
    • Ну и чему радоваться с gcc, gcc настолько суров, что с удовольствием выполнит.

      void *str = (void*)"some text";
      void *test = str + 5;

      хотя это очень сильно нарушает стандарт.
      Ответить
      • Комю, тоже жуёт этот код, а уж кто-кто, а Комю блюдёт Стандарт лучше всех остальных
        Ответить
      • Нарушает, но warning выдаст.
        Ответить
      • >хотя это очень сильно нарушает стандарт.
        если чар гарантирован быть единицей, то войду же не быть нулём? куда уж меньше-то? по-моему, логически ((void*)s + 5) имеет смысл. запрещать нужно если уж совсем строго подходить к проектированию языка (void=пустота), но особо смысла не вижу, выглядит как формальность. то что gcc выдаёт только ворнинг -- имхо, удачный компромис.
        Ответить
        • 1. The void type is an incomplete type that cannot be completed.
          2. For addition ... one operand shall be a
          pointer to a completely defined object type and the other shall have integral or enumeration type.
          Ответить
      • А зачем приведение типов? он и так захавает.
        Ответить
    • Борланд, кстати, тоже такое жуёт.
      Ответить
    • в c++ Builder компилится и выполняется.
      Ответить
    • 40% несчастных случаев начинаются со слов : "смотри, как я умею!"(С)

      Наверно, есть такие задачи...

      P.S. gcc version 4.4.5 - ага.
      Ответить
    • Кхм, как оригинальный ГК нарушает стандарт?
      Ответить
      • Оригинальный - не нарушает, адресная арифметика с войдом, как пример некошегности ГЦЦ, - нарушает.
        Ответить
    • Я даже костыля такого придумать не могу, где на практике мона такое впихнуть?
      Ответить
      • >где на практике мона такое впихнуть?
        struct {int i; long i2;}

        В макросах. Только вот макросы "вредны", но это уже другой вопрос.
        Ответить
        • Обычная структура. Впихнуть можно где угодно. И причем тут макросы?
          Ответить
          • >И причем тут макросы?
            А при том, что в макросах пользоваться именованными структурами иногда тяжелее. Приходится следить за уникальностью имени.
            Ответить
            • Ни хрена не понял, пример будьте добры.
              P.S. Макросы вообще зло.
              Ответить
              • >Только вот макросы "вредны", но это уже другой вопрос.
                >P.S. Макросы вообще зло.
                Троллить изволите?
                Ответить
                • Объясните, причем тут макросы. Большего пока не прошу.
                  Ответить
                  • #define megaMacros(param1, /*...*/) \
                    {\
                    /*...*/\
                    struct megaClass {int i; long i2;} \
                    /*...*/\
                    }
                    Если объясните, что с этим макросом не так, при условии, что он будет использоваться в коде очень много раз, то найдете ответ на свой вопрос.
                    Ответить
                    • >Если объясните, что с этим макросом не так
                      А что здесь "так"? Какую цель преследует данный макрос? Где зависимость от param1 хотя бы? Зачем использовать такое "в коде очень много раз"?
                      Ответить
                      • Эти вопросы здесь лишние.

                        Мне кажется, это очевидно, но
                        Писать в макросе:
                        ... 
                        struct megaClass {int i; long i2;};
                        megaClass param1 ...
                        ...
                        - плохое решение, ибо megaClass не будет обладать уникальностью в данной области видимости.
                        А вот:
                        ... 
                        struct {int i; long i2;} param1 ...
                        ...
                        - уже будет лучше.

                        Ну а то, что макросы - вредны, то оно ясно, лучше их не применять. Я уже об этом говорил в своём первом комменте.
                        Ответить
      • Впихнуть можно в какой-нибудь алгоритм с богатым временным состоянием. В академиях такого добра хватает, на практике встречается редко и реализуется более примити менее продвинутыми средствами языка.
        Дебильные примеры не из жизни: наивное вычисление k-ого числа Фиббоначи, может быть алгоритм Эвклида.
        Ответить

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