1. Си / Говнокод #17385

    +142

    1. 1
    return (guint)(((double)(((double)((SAMPLERATE_48KHZ)) / (((double)(fps_numerator) / (double)(fps_denominator)))))));

    Фу, блять.

    Запостил: codemonkey, 29 Декабря 2014

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

    • Мне не нужно знать правила приведения и приоритеты операторов
      Я успешный человек и расставляю скобки каждый день.
      Ответить
      • Тоже так делаю
        Ответить
        • Да лучше скобки поставить, чем помнить приоритеты и UB языка.
          >(double)(fps_numerator)
          Сишкоблядский каст как всегда на высоте. Как мне не хватает обычной встроенной функции double(fps_numerator).
          Ответить
          • > Как мне не хватает обычной встроенной функции double(fps_numerator)
            Юзай кресты. Там конструктор дабла так и работает.
            Ответить
          • А Вы пишите все функции и все операнды %type% со скобками для универсальности, тогда касты и функции будут симметричны как в JS.
            (double)(3) // преобразование int к double
            (printf)("%d", 3) // преобразование кортежа (char*, int) к монадическому значению типа printf ()
            Ответить
            • Лишние пары скобок получаются, апогей этого в коде поста.
              Edit: Если проебать точки с запятой, как это случилось у вас, то будет беда.
              (Math.sin)(3)
              >console.log("%d", 3) // работает
              >(console.log)("%d", 3) //TypeError: number is not a function
              Ответить
              • > будет беда
                Я с точки зрения выражений и их смысла рассматривал. К (double)(3) можно ещё что-нибудь прибавить, а монадопитушню можно оператором запятой соединить с другой монадопитушнёй.

                > TypeError
                А, известный приём отвязки функции от контекста.
                Кстати, где ошибка? У меня в Chrome 39 и Firefox 34 ошибки нет. Но ещё несколько месяцев назад в хроме ошибка была. Выходит, пофиксили отвязку.
                Ответить
                • > ошибки нет
                  Они, походу, this перестали юзать внутри log(). Ибо у (console.log)(xxx) this будет не console.
                  Ответить
                  • Нет, не перестали. Это просто я проврался. И перепутал со случаем со скобками и запятой.
                    var log = console.log
                    log(3) // Uncaught TypeError: Illegal invocation
                    (1, console.log)(3) // Uncaught TypeError: Illegal invocation
                    (console.log)(3) // 3
                    Ответить
                    • Хм, т.е все-таки (console.log)(3) эквивалентно console.log(3) и this корректно проставляется?
                      Ответить
                      • Да (если я опять не вру).
                        Ответить
                        • Ну в фф 34 работает. Вот только х.з. по спеке это или просто багофича интерпретатора. Не хочется лишний раз испытывать судьбу.

                          > (1, console.log)(3)
                          TypeError: 'log' called on an object that does not implement interface Console.
                          > (console.log)(3)
                          3
                          Ответить
                • >Кстати, где ошибка?
                  (Math.sin)(3)
                  (console.log)("%d", 3)
                  Синус 3 хотят вызвать как функцию с аргументом (console.log).
                  FF29 выдает TypeError: Math.sin(...) is not a function.

                  >У меня в Chrome 39 и Firefox 34 ошибки нет.
                  Хм. А как же он тогда трактует неоднозначный код?
                  Ответить
                  • Понял. Я в консоли команды по одной запускал. В файле конечно же будет как у Вас.
                    Плюс, см. комментарий выше о том, как я проврался.
                    Ответить
          • #define DOUBLE (double)
            Ответить
        • Потому что ты паскальблядь старая
          Ответить
          • А я вовсе не старая, но всё равно так же делаю.
            Ответить
      • > приоритеты операторов
        Коллега вчера написал на пыхе примерно вот такой код:
        $out = $a > 42 and $a < 100500;
        И у and'а приоритет оказался ниже, чем у присваивания...
        Ответить
        • перловое наследие.
          Ответить
        • У нас в студии.....
          Ответить
        • Я если в чем то не уверен вхуячил бы скобки.
          Ответить
          • Куда именно? :) Покажи на примере, пожалуйста, как именно ты бы их поставил, не зная о приоритете and'а.

            P.S. Он таки был уверен, что and и && это одно и то же... За что и поплатился.
            Ответить
            • ну кто виноват маны читать то надо. Ведь сразу мысль возникает на буя одно и тоже по разному называется
              Ответить
              • >ну кто виноват маны читать то надо
                Язык в неочевидном поведении?
                Ответить
              • У меня тоже мысль возникала, нахуя коментарий может быть //, а может быть и #, а, может быть, и такой можно: /* */, но я эти мысли потом прогнал. Так почему же & и and не могут значить одно и то же?
                Ответить
                • Тем более, что в крестах and и &&, внезапно, значат одно и то же. И приоритет одинаковый. Просто их там никто не юзает.

                  > &
                  &&. Не путай их, это совершено разные операторы.
                  Ответить
                • > //, а может быть и #, а, может быть, и такой можно: /* */,
                  Дык и комментарии значат разное, вернее по разному могут интерпретироваться разными *Doc ами
                  Ответить
            • $out = ($a > 42 and $a < 100500);
              очевидно же

              Хотя да, смотрится странно.
              Ответить
              • > очевидно же
                Ну это сейчас очевидно :)

                Когда-то я бы $out = ($a > 42) and ($a < 100500) написал и налетел на косяк. Но сейчас горький опыт подсказывает вообще не юзать неизвестные мне функции/операторы не читая ман...
                Ответить
                • Ну я и написал, что смотрится странно, я бы тоже писать скобки не стал. Вот поэтому в питоне = не возвращает результат (за исключением a=b=c)
                  Ответить
                  • И эта одна из вещей, за которые мне нравится питон.
                    Ответить
                    • Не ебет; ты лучше скажи, за что любишь кресты!
                      Ответить
                      • Первая любовь запоминается навсегда :)

                        P.S. Хотя до них были бейсик и паскаль, но вот их не особо хочется юзать.
                        Ответить
                        • Почему не что-то с ГЦ? Нахуй вообще нужны "кресты",когда есть php?
                          Ответить
                  • Но значки и их приоритеты остаются.
                    Недавно я обнаружил (о чём Борманд меня предупредил), что == в питоне приоритетнее, чем and (в отличие от C, C++, JS и даже && в PHP). И тут результат присваивания или его отсутствие ничем не помогло.

                    Надо сразу убирать операторы, чтобы не было проблем с приоритетами операторов.

                    P.S. А ещё в вашем питоне есть a = 1, 2, 3 и a = 1; 2; 3.
                    Ответить
                    • > == в питоне приоритетнее, чем and
                      > в отличие от C, C++
                      WTF?! Сравнения, емнип, во всех языках приоритетнее чем логическое "и", чтобы была возможность писать a == b && c == d без лишних скобок.
                      Ответить
                      • Тьфу, да. Вечно путаюсь в этих всех "приоритетнее", "вычисляется раньше", "писать в РБНФ надо позже", но когда пишу сишковыражения, знаю, где ставить скобки и всё понимаю.

                        http://govnokod.ru/17226#comment257406
                        Вот тот пример. В сишке ^ выполняется раньше ==, а в питоне я соснул. А я почему-то про == и and подумал, хотя в C действительно сначала ==, потом &&, а в питоне наоборот.
                        P.S. Или не наоборот, что-то я вконец запутался.
                        P.P.S. Точно не наоборот, всё хорошо с and в питоне, а вот с ^ плохо.
                        Ответить
                      • Не во всех. В Паскале логическое «и» приоритетнее, чем сравнение. В Паскале вообще нет различия между побитовым «и» и логическим, поскольку в нём нет питушни с автоматическим приведением типов.
                        Ответить
                    • Вполне логично, как бы ты расставил приоритеты здесь: a==b & c==d ? Edit: bormand опередил.

                      >А ещё в вашем питоне есть a = 1, 2, 3 и a = 1; 2; 3.
                      А еще в нашем питоне ; используется только в однострочниках, так что нехуй . Меня больше волнует неявное сложение строк

                      'a' 'b'
                      Ответить
                      • > a==b & c==d
                        Я бы сделал так, чтобы a==b & c==d было эквивалентно a==(b & c)==d, а a==b && c==d оставить эквивалентным (a==b) && (c==d).
                        Т.е. у ^,&,| сделал бы приоритеты повыше ==. Хотя, я бы ещё равенства и сравнения в приоритетах уравнял.

                        > неявное сложение строк
                        Круто, как в сишечке, мне нравится. Это не баг, это фича
                        Мне в JS ради этого приходится либо писать "a" +\n "b", либо "a\\nb", либо парсить тело функции, а у вас в питоне есть """a\nb""" и 'a'\n 'b'.
                        Ответить
                        • > 'a'\n 'b'.
                          Такого нет.

                          Я не знаю,нужно ли это в говносишечке, все-таки языку 45 скоро будет, но в питоне это точно нахуй не нужно, при том, что сложение литералов скомпилируется в сложенный литерал.

                          x = (
                              'a', 'b' # забыли запятую
                              'c', 'd'
                          )
                          # ('a', 'bc', 'd')

                          Как бы сделать, чтобы на это говно материлось в статике?
                          Ответить
                          • Капча 4444! http://itmages.ru/image/view/2152545/bbfff684

                            > Такого нет.
                            > # забыли запятую
                            Такое есть, это всё моё красное \n всех запутало.

                            В сишечке это удобно для многострочных строк без всяких плюсов (хотя, в C это был бы strcat) или для макросов:
                            #define MACRO(X, Y) printf("%S", #X " is " Y)


                            P.S. А в питоне нельзя всегда писать запятые?
                            В жс можно так:
                            var x = [
                              a,
                              b,
                              c,
                              d,
                            ];

                            Только некоторые браузеры так не умеют, но под них уже наверно не пишут.
                            Ответить
                            • 'a'
                              'b'
                              
                              == 'ab'

                              Сишка это сишка. Нехуй это говно в питон совать.
                              Многострочные строки не дают вставлять комментарии.
                              'a' \ # комментарий
                              'b'
                              # ошибка


                              Запятые писать можно,не в это дело ведь. Фича изначально битая и ненужная.
                              Ответить
                        • >а у вас в питоне есть """a\nb""" и 'a'\n 'b'.
                          Щито?
                          Зогчем \n если есть многострочные строки.
                          >'a''\n''b'
                          У меня сомнения насчёт запаха этого кода даже "a\\nb" получше смотрится.
                          Ответить
                          • Я как раз про них. Красное \n - это \n в тексте программы, а чёрное \n - \n в строке.
                            Ответить
                            • Не проще ли было тег code заюзать?
                              Ответить
                              • Мне показалось, что всё это было бы чрезмерно длинным для простого комментария.
                                Ответить
                    • В J, например, у операторов нет приоритетов.
                      Ответить
    • дабл дабла даблил даблом
      Ответить
    • ((нахуй запоминать)((эти приоритеты)(операторов))((и так)(норм же))
      Ответить
      • Кстати, надо запилить язык с внезапными приоритетами скобок. Скажем, пишет человек ((a || b) / (c * d)), а оно выполняется как-нибудь неочевидно.

        Впрочем, применение функций в руби и хаскеле как раз дают нужный контраст и внезапность.
        Ответить

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