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

    −42

    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
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    #include <iostream>
    
    using namespace std;
    int main()
     {
    for(int i = 0x1; 0x1 <= i; i++)
     {
    int a = 0x5;
    int b = 0xa;
     cin >> i;
    if(b || a)
     {
     a += 0x5;
     cout << "\n ";
     cout << "первое условие: ";
     cout << "\n ";
     cout << "переменная a = " << a;
     cout << "\n ";
     cout << "переменная b = " << --b + 0x5 - 0x9;
     cout << "\n";
    goto var;
     }
    else
     {
     var:
     cout << "\n ";
    cout << "второе условие: ";
     a = (0xa - 0x5);
     cout << "\n ";
     cout << "переменная a = " << a;
     cout << "\n ";
     cout << "переменная b = " << ++b;
     cout << "\n";
     }
    break;
     }
    
     system("pause");
    return 0;
     }

    Попросил чела решить классическую задачку - обменять значениями две переменные, не используя третьей

    Запостил: telhar, 08 Июня 2012

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

    • показать все, что скрытоСоси мой горячий хуй.

      ↓↓↓↓↓ ОН ПИДОР. ↓↓↓↓↓
      Ответить
    • xor уже немодный
      Ответить
    • показать все, что скрытоПИДОР ------> telhar <------ ПИДОР
      Ответить
    • показать все, что скрытоtelhar вы уебством занимаитесь,написал чел да и похуй
      Ответить
    • шел бы ты нахуй
      Ответить
    • показать все, что скрытоЗАХОДИТЕ НА МОЙ САЙТ http://.ru/!!!
      Ответить
    • показать все, что скрытона хуй твоя жопа хороша уебок в реали избил бы тебя как щенка
      Ответить
    • показать все, что скрытоtelhar ты лашарик
      Ответить
    • Каникулы, блядь.
      Ответить
    • > int i = 0x1

      А это что?
      Ответить
    • vercetti да пох на переменную решение было сделано прально условие работает но код хз какой,про такой говорят индуский код
      Ответить
      • пральна? тда там ни одной строчки Пральной
        Ответить
        • Бесконечный цикл, не повторяющийся ни разу. Внутри цикла объявляются a и b, им присваиваются значения и сразу же проверяется существование. зачем-то goto, которое ведет к следующей же строчке.
          Ответить
      • Это в четыре строки делается. Классика.
        Ответить
        • В три:
          a ^= b;
          b ^= a;
          a ^= b;
          Ответить
          • но только для целых
            Ответить
            • Ну можно ^= поменять на += и -= для числовых типов.
              А для произвольного типа это же невозможно?
              Или я туплю?

              P.S. С += для чисел с плавающей точкой может возникнуть погрешность, а для целых, если язык проверяет, исключение по переполнению. Так что я совсем в сомнениях.
              Ответить
              • грубо говоря, все есть последовательность байтов...
                Ответить
                • Ну кастовать &a в (char*) тоже нехорошо. У разных типов разный размер, придется вставлять например switch по sizeof(a)...
                  switch (sizeof(a)) {
                  case 8:
                      *((uint64_t*)&a) ^= *((uint64_t*)&b);
                      *((uint64_t*)&b) ^= *((uint64_t*)&a);
                      *((uint64_t*)&a) ^= *((uint64_t*)&b);
                      break;
                  case 4:
                      *((uint32_t*)&a) ^= *((uint32_t*)&b);
                      *((uint32_t*)&b) ^= *((uint32_t*)&a);
                      *((uint32_t*)&a) ^= *((uint32_t*)&b);
                      break;
                  case 2:
                      *((uint16_t*)&a) ^= *((uint16_t*)&b);
                      *((uint16_t*)&b) ^= *((uint16_t*)&a);
                      *((uint16_t*)&a) ^= *((uint16_t*)&b);
                      break;
                  case 1:
                      *((uint8_t*)&a) ^= *((uint8_t*)&b);
                      *((uint8_t*)&b) ^= *((uint8_t*)&a);
                      *((uint8_t*)&a) ^= *((uint8_t*)&b);
                      break;
                  default:
                      throw InvalidArgumentError();
                  }

                  Или я совсем туплю?
                  Ответить
                  • да, в принципе нормально.
                    а что если менять не значения, а ссылки?
                    Ответить
                    • Вы про случай void test(int &a, int &b)?
                      Да вроде должно нормально поменять.
                      Ответить
                      • int val = 100;
                        int & a = val;
                        int & b = val;
                        test(a, b); // problems?
                        Ответить
                        • В Аде никаких проблем :3
                          Ответить
                          • в аде a ^= a; работает как то иначе?
                            Ответить
                            • Передача целого по ссылке в Аде - это не передача указателя. Помнишь, обсуждали?
                              Ответить
                              • предлагаю тебе всего лишь взять что то типа ideone и написать уже аналог swap(int & a, int & b) в три классических ксора, чтобы было наглядно
                                ну и вызвать его с swap(a, a), вывести a
                                Ответить
                                • На слово поверишь? А то может мне ещё код сложения 2+2 на Аде тоже на идеоне выписать?
                                  Ответить
                                • При вызове swap(a,a) он его обнулит первым xor'ом?
                                  Ну собственно это не проблема ссылок, а проблема самого алгоритма с ксорами - он по определению не пашет на одной переменной.

                                  А для устранения этого досадного случая можно добавить в начало функции if (&a != &b) return
                                  Ответить
                                  • Как раз Ада при вызове Swap не обнулит. Потому что в Аде передача целого по ссылке - это копирование значения в функцию, вызов функции, копирование изменённых значений обратно. И никаких тормозных указателей. Значения могут прийти в функцию (и выйти из неё) в регистрах, например. говНяшка с её указателями сосёт.
                                    Ответить
                          • в питоне, руби, груви ваще без проблем
                            a,b=b,a
                            или
                            [a,b]=[b,a]
                            даж в пхп
                            list(a,b)=array(b,a)

                            я уж молчу про перл
                            Ответить
                            • Читеры они все.
                              Ответить
                            • Короче или сопоставимое немерловому свопу есть что-нибудь?
                              http://ideone.com/Zq26N
                              a<->b
                              Ответить
                              • куда уж короче?
                                а вообще, задача не такая частая, чтобы спецконструкцию городить, чреватую неоднозначностями
                                Ответить
                              • В пайтоне, перле и пхп можно что типа этого:
                                (a, b) = (b, a)

                                Если именно оператор, то в Icon есть :=:
                                Ответить
                                • >(a, b) = (d, a)
                                  Костыли.
                                  std::swap(a, b) и то лучше смотрится. Хоть дублирования переменных нет и меньше шансов на опечатку.
                                  Ответить
                                • Интересно вот - создается ли при этом в куче временный тупл?
                                  Ответить
                                  • От реализации и от языка зависит, но обычно создаётся.
                                    В случае value типов это может быть неприятно.
                                    В том же C++ это тоже возможно, хоть и не так красиво:
                                    http://ideone.com/j4Mw2
                                    tie(b, a)=make_tuple(a, b);

                                    Для того же std::vector это жуткий перерасход. Создастся по копии на каждый вектор, в то время, когда достаточно одной, а в случае stl даже 0. std::swap тем и хорош, что для stl контейнеров обмен происходит за О(1) и потребление памяти О(1).
                                    Я однажды видел в С++ коде обмен через кортежи в те времена, когда ещё boost::tuple отсутствовал в стандарте С++ и выглядело это так:
                                    tie(b, a)=tie(a, b);
                                    Но, думаю, и так понятно, что Акеллагоре-оптимизатор промахнулся.
                                    http://ideone.com/98C8j
                                    Ответить
                              • (defmacro <-> (a b)
                                  `(rotatef ,a ,b))
                                
                                (<-> x y)
                                http://ideone.com/7IYgX
                                Ответить
                    • Но поменяет значения, на которые ссылались ссылки...
                      А сами ссылки они же иммутабельны, как их поменять...
                      Ответить
            • Для любых битовых последовательностей одной длины.
              Опять я про кулхацкерские байтоёбские штучки...
              И да, с неподами может случиться хуйня.
              Ответить

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