1. ActionScript / Говнокод #12654

    −116

    1. 1
    2. 2
    for (var i:int = 0; i < _dropCount;_dropCount--)
       // todo

    Запостил: Cpp, 26 Февраля 2013

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

    • 2^31+1 итерация при любом положительном _dropCount...
      Ответить
      • Но ведь в цикле изменяется _dropCount, а не i
        Ответить
        • Старею...
          Ответить
          • Это скорее доказывает говнистость кода: если уж @bormand, умеющий парсить point-free хацкел-код, неправильно понял цикл с первого взгляда, следовательно, цикл - говно.
            Ответить
    • почему переменную цикла называли i? потому что iтератор... а здесь... разрыв шаблона )
      Ответить
    • слишком молод что б наложить, сделайте это за меня :
      public long getLong(){
      return (long) ((getDouble()-353)*20*50*10);
      }


      "оптимизирует" с PG и компилит в:
      public long getLong(){
      return (long)(20.0D * 50.0D * 20.0D * (this.getDouble() - 353.0D));
      }


      c return (long) ((getDouble()-353)*(20*50*10));
      всё нормально
      Ответить
      • Проблема в том, что 10 превратилось в 20? Или это тупо опечатка, а проблема в том, что константы не свернулись в одну?

        P.S. Судя по стилю именования getDouble и public перед методом - это жаба. Версия компилятора какая? Чем изучали выхлоп?

        PG - ProGuard или я туплю?
        Ответить
        • P.P.S. Если мне не изменяет память, сам javac никогда ничего не оптимизирует, и генерит код дословно, как написано, перекладывая всю оптимизацию на JIT.

          А вот почему ProGuard не стал перемножать константы - х.з. Его ман утверждает, что одна из его оптимизаций "Evaluate constant expressions".
          Ответить
          • P.P.P.S. Про javac наврал, в версии со скобками он сам умудряется объединить 20*50*10 в 10000.

            Не хотят пользоваться коммутативностью и ассоциативностью умножения ;)
            Ответить
            • >проблема в том, что константы не свернулись в одну
              да.
              опечатка была - вместо одного значения 20.0D должно быть 10.0D
              Java и ProGuard и всё под Android
              Ответить
    • А так нельзя?
      while(_dropCount)
      {
      _dropCount--;
      //some logic
      }
      Ответить
      • 1) Не эквивалентно коду ОП'а при отрицательных _dropCount.
        2) Если _dropCount юзался внутри цикла, то декремент надо поставить после some logic.

        Полный эквивалент:
        while (_dropCount > 0) {
            // some logic
            _dropCount--;
        }
        Ответить

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