1. JavaScript / Говнокод #19294

    +1

    1. 1
    2. 2
    3. 3
    while ((math == (math = Math)).toString() == "true") {
       ...
    }

    программист-дотер

    Запостил: mikamika83, 12 Января 2016

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

    • (math == (math = Math)).toString().length < 5

      fixed
      Ответить
    • почему выражение
      (math == (math = Math))
      возвращает false?
      разве не должно быть как с ++i + ++i ?
      Ответить
      • Так присваивание-то одно, это не UB.
        Хм, а почему false? Первым должно вычислиться (math = Math), ибо скобки, после чего '==' вернет true. Или я чего-то не понимаю?
        Ответить
        • > var Math = 1;
          > var math = 0;
          > (math == (math = Math))
          < false
          > math
          < 1
          > Math
          < 1

          Wtf? Жсеры, помогите!
          Ответить
          • Да вроде всё и без жсеров понятно
            > function a() { console.log("A();"); return "ok"; }
            > function b() { console.log("B();"); return "o"; }
            > (a() == (b() + "k"))
            A();
            B();
            < true
            Ответить
            • но ведь справа скобки, то что в скобках должно исполняться первым
              Ответить
              • Почему? Не знаю как в этом вашем говноjs, но в си порядок вычисления выражений слева и справа от == не определен. Скобки или нет, не важно.
                Ответить
              • Потому что приоритет сравнения выше чем приоритет присваивания

                https://developer.mozilla.org/ru/docs/Web/JavaScript/Reference/Operators/Operator_Precedence
                Ответить
                • DELETED
                  Ответить
                  • > (a == ( c = a)) возвращает true
                    Потому что значение этого выражения не зависит от порядка вычисления аргументов оператора ==, в отличие от (a == (a = c)).
                    Ответить
                    • >> не зависит от порядка вычисления аргументов оператора ==, в отличие от (a == (a = c)).

                      а тут как зависит?
                      Ответить
                      • Если вычисляется сначала левая часть a, а потом правая a = c, то будет false.

                        Если вычисляется сначала правая часть a = c, а потом левая a, то будет true.

                        Мутабельные переменные такие мутабельные.
                        Ответить
                  • var a;
                    (a = 'wotafack') == a; //true

                    var b;
                    b == (b = 'wotafack'); //false
                    Ответить
                    • А, ну тут все логично - старое значение b сравнивается с wotafack. Или не логично? Короче, не зря в питоне = не возвращает значение.

                      Можно в этом вашем js посмотреть на дизассемблер?
                      Ответить
                      • > Короче, не зря в питоне = не возвращает значение.
                        Да, огромный плюс, кстати. И ++ выпилен.

                        > А, ну тут все логично - старое значение b сравнивается с wotafack.
                        Да, всё верно.
                        Ответить
                        • >> Да, огромный плюс, кстати. И ++ выпилен.
                          >>

                          Плюс заключается в том, что ты не можешь писать как мудак, даже если очень хочешь? Это не плюс питона, это минус программиста на си
                          Ответить
                          • > ты не можешь писать как мудак, даже если очень хочешь
                            Ну дык почти весь питон в таком стиле выдержан.
                            Ответить
                            • >Ну дык почти весь питон в таком стиле выдержан.
                              Интересно, где еще? В языке с ДТ в ногу себе выстрелить гораздо проще чем в со статической.
                              Ответить
                              • > В языке с ДТ в ногу себе выстрелить гораздо проще чем в со статической.
                                Хе-хе. Ты просто не писал на крестах.
                                Ответить
                                • Я писал на жаве.
                                  Ответить
                                  • Жаба типобезопасная
                                    Плюсы типо безопасные


                                    В жабе нет и 10ой части выстрелов в ногу, что есть в плюсах
                                    Ответить
                • Но как можно сравнить a() и b() не вычисляя их?
                  Ответить
              • > то что в скобках должно исполняться первым

                Ок...

                (a = Math) == (a = Phys)

                Какие скобки должны выполняться первыми?
                Ответить
                • в твоем примере скобки были только с одной стороны. и у топикстартера также

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

                    a() + (b() + "k")
                    A();
                    B();
                    "okok"
                    Ответить
                    • http://ideone.com/2sukDh
                      а у джаваскрипта получается 13
                      Ответить
            • Мда, тяжелый случай.
              Ответить
      • приоритет левой и правой частей сравнения одинаковый вне зависимости от скобок
        Ответить
    • Как в js посмотреть во что компилируется код?
      Ответить
      • Э... Он же интерпретируемый, не?

        Ну а если ты юзаешь какой то компилятор js для своих нужд, то он должен выдавай файлик, там и смотри
        Ответить
        • Ну может ему выхлоп jit'а интересно глянуть.
          Ответить
        • JS компилируется, как и Java. Но, в отличие от Java, нет стандарта на байткод. У разных движков байткод может быть разным.
          Ответить

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