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

    +17

    1. 1
    2. 2
    3. 3
    4. 4
    int a=0; 
    while (a<=1 && a>=0) { 
      a--; 
    }

    Я даже хз, что тут автор делает...

    Запостил: kostoprav, 19 Июня 2013

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

    • Это полный код, или фрагмент? Если полный - то код эквивалентен a = -1. Если не полный - то хотелось бы больше контекста, может там a не всегда 0 при старте, или декремент не безусловный?
      Ответить
      • Полный, к сожалению.
        Ответить
        • О_о.
          Ответить
          • Скорее всего автор не знает, что такое do while.
            do
            {
               a--
            } while(a>0)
            Ответить
            • Скорее всего автор не знает, что такое a = -1;
              Ответить
              • Серьезно? Вы и правда думаете, что автор понимая циклы, не знает, что такое присваивание?
                Очень сомневаюсь.
                Ответить
                • С учетом того, что это кусок проверочного задания, я уже ни о чем не думаю. :)
                  Ответить
                  • Собеседование?
                    Ответить
                  • А можно условие задания? :)
                    Ответить
                    • Определить, используя любой язык программирования (набор в bootcamp), является ли число четным. Причем этот кусок к заданию вообще не имеет отношения. Висит посреди кода и радует глаз.
                      Ответить
                      • мда
                        Ответить
                      • > является ли число четным
                        bool is_even(int a) {
                            while (a > 1)
                                a -= 2;
                            while (a < 0)
                                a += 2;
                            return a == 0 ? true : false;
                        }
                        Меня примут? ;)
                        Ответить
                        • как в code самому раскрашивать текст?
                          Ответить
                        • за вами уже выехали
                          Ответить
                        • примут ... и вылечат.
                          Ответить
                        • function IsEven(a: integer): boolean;
                          begin
                            if a = 0 then begin
                              result := true;
                              exit;
                            end;
                            if a = 1 then begin
                              result := false;
                              exit;
                            end;
                            if a = 2 then begin
                              result := true;
                              exit;
                            end;
                            if a = 3 then begin
                              result := false;
                              exit;
                            end;
                            if a = 4 then begin
                              result := true;
                              exit;
                            end;
                            if a = 5 then begin
                              result := false;
                              exit;
                            end;
                            if a = 6 then begin
                              result := true;
                              exit;
                            end;
                            if a = 7 then begin
                              result := false;
                              exit;
                            end;
                            if a = 8 then begin
                              result := true;
                              exit;
                            end;
                            if a = 9 then begin
                              result := false;
                              exit;
                            end;
                            if a = 10 then begin
                              result := true;
                              exit;
                            end;
                            if a = 11 then begin
                              result := false;
                              exit;
                            end;
                            result := not true and not false;
                          end;
                          Ответить
                        • В министерство причудливого кода
                          Ответить
                        • А меня?
                          public static bool IsEven(int a)
                          {
                              string s = a.ToString();
                              return ("02468".IndexOf(s[s.length - 1]) >= 0);
                          }
                          Ответить
                        • > Меня примут?
                          кстати, что надумал насчет работы в европейской части страны?
                          Ответить
                        • А почему бы не раздеить на 2 и не проверить есть ли остаток?
                          Ответить
                          • > А почему бы не раздеить на 2 и не проверить есть ли остаток?
                            Потому что это слишком просто и тривиально ;)
                            Ответить
                            • Более не могу сдерживаться:
                              function чётное(n){
                                if(confirm('Подтвердите, пожалуйста, чётность числа ' + n))
                                   return 'Число '+n+' - чётное.';
                              }
                              Ответить
                        • Нет.

                          function isEvent(a){
                            return a % 2 == 0;
                          }
                          Ответить
                      • А можно мне?
                        function isEven(a: integer): PChar;
                          const names: array[boolean] of PChar = ('НЕТ', 'ДА!');
                          begin
                            isEven := names[not Odd(a)]
                          end;

                        http://ideone.com/s1sGJ5
                        Ответить
                        • Odd(a)
                          Читер!
                          Ответить
                          • Хорошо, без читерства, так без читерства:
                            type
                              TOddness = class
                                private
                                  data: Integer;
                                  function isEven: boolean;
                                public
                                  constructor Init(a: Integer);
                                  property Evenness: boolean read isEven;
                                end;
                            
                            constructor TOddness.Init;
                              begin
                                data := a
                              end;
                            
                            function TOddness.isEven;
                              function doMagic(x: Integer): Integer;
                                begin
                                  if x > 1 then 
                                    doMagic := doMagic(x - 2)
                                  else if x < 0 then 
                                    doMagic := doMagic(x + 2)
                                  else 
                                    doMagic := x
                                end;
                              begin
                                isEven := doMagic(data) = 0
                              end;


                            http://ideone.com/WheSmt
                            Ответить
                            • Зачем операторные скобки от заголовка сдвигаешь,, некрасиво же.
                              Ответить
                              • GNU-style? Прочитал сначала как императорные скобки.
                                Ответить
                              • К тому же у меня лишняя вложенная функция... Исправил:
                                function TOddness.isEven;
                                var tmp: TOddness;
                                begin
                                  if data > 1 then begin
                                    tmp.Init(data - 1);
                                    isEven := not tmp.Evenness
                                  end else if data < 0 then begin
                                    tmp.Init(data + 1);
                                    isEven := not tmp.Evenness
                                  end else 
                                    isEven := data = 0
                                end;
                                Ответить
                                • Не скомпилируется.
                                  Надо
                                  tmp := nil;
                                  try
                                    tmp := TOddness.Init(data-1);
                                    if Even := not tmp.Evenness;
                                  finally
                                    tmp.free;
                                  end;
                                  Ответить
                            • Пойдем дальше
                              trait Nat {
                                def next: Nat = this match {
                                  case _: Odd => Even(this)
                                  case _: Even => Odd(this)
                                }
                              }
                              
                              case class Odd(val prev: Nat) extends Nat
                              case class Even(val prev: Nat) extends Nat
                              object Zero extends Even(null)
                              
                              def isEven(n: Nat): Boolean = n match {
                                case _: Even => true
                                case _: Odd => false
                              }
                              def isOdd(n: Nat): Boolean = n match {
                                case _: Even => false
                                case _: Odd => true
                              }
                              
                              val four = Zero.next.next.next.next
                              val five = four.next
                              
                              assert(isEven(four))
                              assert(isOdd(five))
                              
                              // КОНСТРУКТОРОПРОБЛЕМЫ:
                              // val noSoupForYou = Even(Zero)
                              // assert(isOdd(noSoupForYou.prev))
                              Ответить
                        • уже не вылечат.
                          Ответить
                        • уже не вылечат.
                          PS
                          >Ошибка компиляции комментария: На ГК даже комменты компилятся
                          Ответить
                      • Ещё одно решение:
                        ror	$1, %eax
                        setnc	%al
                        movzx	%al, %eax


                        http://ideone.com/aICebw
                        Ответить
                        • Дополнение. Вместо ror $1, %eax здесь можно использовать bt $1, %eax.

                          Но более универсальным будет такое решение:
                          bsf	%eax, %eax
                          cmpl	$1, %eax
                          jae ...
                          Если во второй строчке заменить $1 на другую константу, то можно проверять кратность не только двум, но и произвольной степени двойки.

                          А в этой вашей сишечке есть аналог bsf?
                          Ответить
                          • __builtin_ffs*() - в нормальном конпеляторе есть, а питушня не интересует.
                            Ответить
                            • За что минусы? Типа по вашему конпелятор не должен иметь такие штуки? Которые реализуют недоступные Сишки фичи?
                              Ответить
                          • > bsf
                            Он, емнип, медленный, не стоит его юзать без причины.
                            Ответить
    • return a&1;
      нынче не в моде
      Ответить
      • > a & 1
        является ли число четным
        Ответить
        • показать все, что скрытоТогда уж ~0.
          Ответить
          • а что даст ~0?
            Ответить
            • Инвертирует биты в нуле правщая его из нуля в 0xffffffff, что есть -1 для инта. А 0 без постфикса - это инт. Как питушки заминусовали, как заминосовали.
              Ответить
              • это я знаю. спасибо, кэп.
                Ответить
                • показать все, что скрытоко-ко-ко, а что спрашиваешь, если знаешь? И почему ты написал a&1? Который вернёт тебе первый бит, если есть первыйбит.
                  Ответить
                  • правильно, который определяет четность
                    Ответить
                    • показать все, что скрытоПричём тут чётность, питух? И к чему тут твоя чётность, питух? Слился, так заткнись и не минусуй.
                      Ответить
                      • http://govnokod.ru/13191#comment182489
                        Ответить
                      • К тому, что эта ветка посвящена проверке четности числа.
                        Ответить
                        • А с чего тут взялась чётность числа?
                          Ответить
                          • bormand 4 часа назад # 0
                            А можно условие задания? :)

                            ava kostoprav 4 часа назад # 0
                            Определить, используя любой язык программирования (набор в bootcamp), является ли число четным. Причем этот кусок к заданию вообще не имеет отношения. Висит посреди кода и радует глаз.

                            Ну и лур в начал этой ветки написал a & 1, что проверяет число на нечетность.
                            Ответить
                          • http://govnokod.ru/13191#comment182441
                            Ответить
                      • А причём тут ~0?
                        Ответить
                      • и да:
                        > и не минусуй.
                        я принципиально не минусую. если бы я взялся минусовать, то ты бы захлебнулся.

                        вот демо.
                        Ответить
                        • Только не рассказывай никому, как ты это делаешь.
                          Ответить
                          • а толку? господа программисты - материалисты, они не верят в чертей и магию вуду.
                            Ответить
                        • читер
                          Ответить
                  • Он вернет последний бит равным еденице, если число было не четным(у него тоже последний бит равен еденице) и 0 если четным(последний бит был равен 0).
                    Ответить
                    • почему последний? нулевой же. т.к. 2**0 == 1
                      Ответить
                      • Вы о чем?
                        8(10) = 1000(2)
                        9(10) = 1001(2)
                        8&1 = 1000 & 0001 => 0000 четное
                        9&1 = 1001 & 0001 => 0001 не четное
                        Ответить
                        • Кокоша. Бты идут с права на лево - они сдвигаются, поэтому бит, который отвечает за последний(самый маленький) разряд - есть бит, который является первым(нулевым).

                          100
                          100000
                          10000000

                          Видишь у тебя порядки растут, но самая первая(нулевая) единица - всегда первая(нулевая).

                          Так же и тут. 1000 1001 1010 1011 1100 - самый правый - есть самая первый(нулевой бит).
                          Ответить
                          • А я читаю числа слева на право.
                            Ответить
                            • Все читают слева направо. Но, тем не менее, принято называть самый младший бит (самый правый) нулевым.
                              Ответить
                              • Нулевой синоним первого?
                                Ответить
                                • Нет, в зависимости от системы отсчёта. У куллхацкеров принято называть с нуля, а можно и с 1-го.
                                  Ответить
                              • обычно эти биты в документации просто именуются LSB, MSB
                                потому что даже подрисовав к ним 0..N (особенно именно в таком порядке бгг) всё равно можно оставить зерно сомнений у читающего
                                Ответить
                                • Безусловно. Фраза "младший бит" однозначно говорит о том, что это за бит. Но так же скучно, нет повода для ошибок и холиваров, нельзя никого подловить нулевым битом :)

                                  Ну и LSB и MSB это хорошо, но для второго бита то обозначения нет ;)
                                  Ответить
                                  • LSB+1
                                    Ответить
                                    • > LSB+1
                                      Т.е. взять младший бит и прибавить к его значению единичку?
                                      Ответить
                                      • Я считал LSB индексом. В любом случае терминологию можно обговорить чуть выше в доке
                                        Ответить
                                        • > В любом случае терминологию можно обговорить чуть выше в доке
                                          Это да, если уж даже всякие MUST, SHALL и т.п. имеют формальное описание.
                                          Ответить
                        • И да, ололоша - это никакая не чётность, а первый(нулевой) бит, который может отвечать за что угодно.
                          Ответить
                          • > первый(нулевой) бит, который может отвечать за что угодно
                            Т.е. ты отрицаешь то, если в нулевом бите 0, то число четное, а если 1 - то нечетное? ;)

                            > который может отвечать за что угодно.
                            В частности за четность ;)

                            P.S. Ну да, на некоторых редких архитектурах, на которых отрицательные числа записаны не в коде с дополнением до двух, для отрицательных чисел оно не прокатит ;)
                            Ответить
                            • >Т.е. ты отрицаешь то, если в нулевом бите 0, то число четное, а если 1 - то нечетное? ;)
                              Глупая лалка. Причем тут твоя чётность вообще - это лишь представление чисел в битах. В частности, но только анскильный питух скажет, что & 1 - это проверка на чётность, который нихрена не понимает в битах, являясь тотальным питухом, а знает о битах с их питух базара.

                              ко-ко-ко. Это питушиное созданание.
                              Ответить
                              • Блин... Ну где я говорю, что a & 1 это только проверка на четность, и ни для чего больше это поюзать нельзя? Я имею в виду только то, что с помощью a & 1 в частности, можно проверить является ли число четным или нечетным. Или ты хочешь сказать, что нельзя?

                                > это лишь представление чисел в битах
                                А кто-то с этим спорит? Как моя фраза "если в нулевом бите 0, то число четное, а если 1 - то нечетное" этому противоречит? Я извлек с помощью a & 1 нулевой бит из a, и воспользовался им для проверки четности числа. Так устроит?
                                Ответить
                                • Ну дак зачем ты поднял эту ветку? Я разве где-то говорил, что a&1 - это в частности НЕ проверка на чётность? Я лишь сказал, что это битик, который может отвечать за что угодно, ибо мне начали кукарекать про то, что это никакие не битики, а проверка на чётность.

                                  >А кто-то с этим спорит? Как моя фраза "если в нулевом бите 0, то число четное, а если 1 - то нечетное" этому противоречит? Я извлек с помощью a & 1 нулевой бит из a, и воспользовался им для проверки четности числа. Так устроит?
                                  Да. Проверка на чётность - это уже интерпритация выхлопа данной операции к определённому формату битиков.
                                  Ответить
                          • Да вы что?
                            А это -
                            a<<1
                            никакое не умножение на два, а сдвиг.
                            Почему все так категорично? Неуж то нельзя увидеть что-то другое в коде?
                            Ответить
                            • Это не умножение на 2 и не минус, а сдвиг. У него тысячи применений, в которых люди даже не думают о каких-то там минусах и умножениях. Когда юзают and тоже не думают ни о каких-то там чётностях и прочем.


                              Поэтому констекст a & 1 не говорит ниочём. Авось я сделал так a >>= 10; a & 1 и т.п. - всё это для питухов. Максимум, что можешь сказаь "берёт бит".
                              Ответить
              • a & ~0 всегда равно просто a.
                Ответить
                • а a всегда равно a.
                  если не нан конечно
                  Ответить
                • только если они одного размера, иначе могут быть чудеса кастования.
                  Ответить
                  • > чудеса кастования
                    Сразу вспоминается http://habrahabr.ru/post/172731/ про |0 в JavaScript. Но это уже другая история оффтоп.
                    Ответить
        • !a & 1, в одну битовую операцию не соображу как
          Ответить
          • Битовую - никак. Но можно написать a-1. При единичке будет 0, при остальных не ноль, что вполне проканает для bool'а.
            Ответить
            • да, когда уже получили единичку
              Ответить
              • А да, я идиот. Четность же проверять надо.
                Ответить
              • Одна операция:
                return a << (sizeof(a) * CHAR_BIT - 1);
                Ответить
                • ах ты питушара, апиридил миня
                  Ответить
                • А если размер a неизвестен, на помощь придёт операция «подёргивание»:
                  return a == ((a >> 1) << 1);
                  Ответить
                • И опять чётное переходит в ноль, а нечётное в неноль. Не то.
                  Ответить
                  • Точно ;(
                    Ответить
                  • Вот именно поэтому в Паскале функция Odd есть, а функции Even нет.
                    Ответить
                    • odd - "странный"
                      Ответить
                      • even - "даже"
                        Ответить
                        • даже странно, что нет Even, а есть Odd
                          Ответить
                          • Боюсь представить, как эта фраза звучит по-английски.
                            Ответить
                            • <оффтоп>
                              а как фраза не пугает зеленая зелень зеленит зеленую зелень...
                              </оффтоп>
                              ЗЫ
                              Извиняюсь за боян
                              Ответить
                              • Ерунда. Совсем другое дело примеры:
                                — Косил косой косой Косой косой косой.
                                — When the doctor doctors doctor, does the doctor doctor doctor the way the doctor he is doctoring doctors?
                                Ответить
                            • Гугл "странно" перевёл как strange, а "даже" заменил на "очень".
                              Ответить
            • Но ведь (a - 1) превращает чётное в нечётное и наоборот, что как раз нужно.
              Ответить
          • надо знать число бит в a - тогда получится в одну операцию
            a << 31, нопремер
            Ответить
          • Здесь остаётся только (~a) & 1
            Ответить
    • показать все, что скрытоВот объясните мне, с++ питушки - что в этом окде такого? Для конпелятора ваши С++ награмождения такой же код, но вы говорите, что ваше нагромождение говн понятно. Автор тоже решил писать понятно, а gcc сделал:
      movl	$-1, %edx



      Вы же не удивляетесь, когда ваши питух-векторы конпелятор заменяет на рассово верные пацанские указатели, а классы выпиливает нахрен.
      Ответить
      • > Вы же не удивляетесь, когда ваши питух-векторы конпелятор заменяет на указатели, а классы выпиливает нахрен.

        Потому что классы - это абстракция чисто на уровне языка, в коде их быть не может.
        Ответить
        • Хм, у вас и в коде абстракция на абстракции - вы вместо присваивания юзаете конструкторы, которые являются функциями и ничем не отличаются от этого кода.


          Двойные стандарты такие двойные.
          Ответить
          • > вы вместо присваивания юзаете конструкторы, которые являются функциями и ничем не отличаются от этого кода.

            Ну для простых структур -да.
            А причём тут двойные стандарты?
            Ответить
      • Как ты уже заебал...
        Ответить
    • где тут C++???
      Ответить

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