1. Java / Говнокод #16153

    +68

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    int k = 50;
    while (true){
        i = i + i;
        System.out.println(i);
        k--;
        if (k<0) break;
    }

    http://stackoverflow.com/questions/24173463/why-does-i-i-i-give-me-0

    Запостил: evg_ever, 12 Июня 2014

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

    • Почему i не инициализировано? И в чем говно?
      Ответить
      • > И в чем говно?
        В цикле?                                                                                                                                         for (int k=50;k>=0;--k){...}
        Ответить
        • Экспериментальный код на выброс он ведь как лаба. С одной стороны - по определению говно, а с другой - ругать его за это не хочется...

          Ну столкнулся человек первый раз с ограничениями целых чисел, ну что ж теперь. Все через это когда-то проходили.
          Ответить
          • Ну еще к while (true) можно придраться. Зачем проверять условие в конце петли если можно автоматически вначале. Или чувак do-while не знал. в общем не красиво
            Ответить
          • https://ideone.com/dP5etn

            так красивше хоть и с переполннением
            Ответить
            • > Console.WriteLine(i += i);
              Почему бы не написать это i+=i строчкой выше? Штуки в духе while (*dst++ = *src++); писали в далёкие сишкоблядские времена, когда оптимизаторы еще только зарождались...

              > хоть и с переполннением
              Ну ради них весь этот код и существует, все нормально.
              Ответить
              • на мой субьективный - так красивше
                Ответить
                • https://ideone.com/6NzPWt
                  Не сразу понял, что это не Java. Только после того, как мне запретили написать final int x = 1 / i;
                  Хотя, const int x = 1 / i; мне тоже запретили написать, наркоманы.

                  В нормальных языках дают. https://ideone.com/0sxzUE
                  Только там приходится этот x использовать, чтобы его не сомтимизировали (привет, Хаскель!)
                  Ответить
            • i *= 2, нет?
              Ответить
              • умножение медленнее (и когда я успел стать байтодрочером?)
                Ответить
                • > умножение медленнее (и когда я успел стать байтодрочером?)
                  Любой уважающий себя оптимизатор заменит a*=2 на a+=a или a<<=1, а на x86 даже изъебнется и перепишет умножения на 3, 5, 9 и т.п. через lea. Поэтому, имхо, надо писать наиболее подходящий по семантике вариант - если работаем с битами и логическими операциями - сдвиги, если увеличиваем что-то вдвое - умножение.

                  P.S. Тот же g++ даже b = a*i в циклах умудрялся заменять на b += a:
                  for (int i=0; i<argc; ++i) {
                      int x = i * argc;
                      printf("%d\n", x);
                  }
                  .L6:
                      movl    %ebp, %edx
                      xorl    %eax, %eax
                      movl    $.LC0, %esi ; это строка формата "%d"
                      movl    $1, %edi
                      addl    $1, %ebx ; ++i
                      addl    %r12d, %ebp ; то самое преобразование x = n * i в x += n
                      call    __printf_chk
                      cmpl    %r12d, %ebx ; если i != n - продолжаем цикл
                      jne     .L6
                  Ответить
                  • Сам недавно что то такое писал, когда ЯП сдавал
                    Ответить
                • Кстати насчет мифа о медленности умножения - аппаратный умножитель работает чуть-чуть медленнее сумматора. Даже так - N-битный сумматор на выходе умножителя - это самая медленная его часть :)

                  Просто его матрица and'ов и сеть однобитовых сумматоров жрут довольно много транзисторов, и для чего-то больше 32-64 бит строить такую схему не особо выгодно...
                  Ответить
                  • https://ideone.com/zKWHIa

                    как то так. У меня возник страшный вопрос - а можно так же но без do?

                    всмысле do - это же императивщина, как переделать в чистую функциональшину?
                    Ответить
                    • > в чистую функциональшину
                      Как-то так, наверное: https://ideone.com/UGC5jD
                      Ответить
                      • Ну тут и логика отличается - сначала список, затем вывод. Но в целом оно. Спасибо.
                        Ответить
                        • > Ну тут и логика отличается - сначала список, затем вывод.
                          Ну в чистом коде ты вывод и не сделаешь. Так что только так, если хочется отделить чистую часть от I/O.

                          Кстати, в хаскеле есть прикол - часто удобней работать с бесконечными списками, а потом обрезать их, нежели работать сразу с конечными.
                          Ответить
                          • Как раз про них начал читать. Хаски ленив - пока не попросишь элемент он его не считает и на этом бесконечный список и держится?
                            Ответить
                            • Всё верно
                              Ответить
                              • отлично. Может и я когда то дорасту до полноценного элитарного программиста)
                                Ответить
                • >>умножение медленнее
                  < шепелявит >Ты из какого года, милок? Из 2000, нябось?
                  Ответить
                  • 91 года сборки. А так - для меня вечно 2000ый с хвостиком
                    Ответить
    • Руслан сбросил звонок и бегом спустился на парковку. Домчаться по ночному городу до дома Виталия было делом нескольких минут - только бы он оказался там. Руслан взлетел по лестнице и попытался определить, в какую дверь звонить. Старая, обитая дерматином дверь справа по расположению окон должна была вести в нужную квартиру.
      Ответить

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