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

    +140

    1. 1
    return (a >= factor || (a == factor && (c & 1) == 1)) ? 1 : 0;

    https://github.com/mono/mono/blob/master/mono/metadata/decimal.c

    Запостил: carsten, 25 Июня 2011

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

    • показать все, что скрытоFuuuuu!
      Ответить
    • показать все, что скрытоЧто-то много лишнего.
      return a >= factor;
      Ответить
      • Промазал и минусанул.
        Разве у true значение гарантировано быть 1? По-моему по стандартам гарантировано только, что "не 0".
        Там по замыслу нужно int возвратить, а не bool.
        В общем, это то же, что и return (a >= factor)? 1: 0;
        Один фиг компилятор скорее всего заоптимизирует.
        Ответить
        • 6.5.8.6. Each of the operators < (less than), > (greater than), <= (less than or equal to), and >= (greater than or equal to) shall yield 1 if the specified relation is true and 0 if it is false.
          The result has type int.
          Ответить
          • Точно, проверил -- так оно было уже в C89 draft.
            Но видимо какие-то проблемы были с компиляторами, раз многие ентого боятся
            Ответить
          • p.s.
            Всё-таки это не всем читающим код будет очевидно, особенно после того как мир познал C++, C#, Java (он уже не будет таким, как прежде).

            Плюс ещё семантика. Т.е. например char гарантирован быть единицей, но я никогда не пишу в си "malloc(4)", я пишу malloc(sizeof(char)*4) -- чтобы видна была *семантика* -- что мы выделяем четыре символа, а не четыре непонятных абстрактных байта.

            Тут так же, имхо. Мы показываем семантику -- что мы возвращаем число, а не bool. Пусть синтаксически и избыточно...
            Ответить
            • Так-то оно так, я сам предпочитаю sizeof(char), '\0', NULL и != 0. Но тут есть опасность, что кто-то, насмотревшись, станет писать ? true : false. В общем, нужно смотреть семантику функции — есть ли шанс, что константы 1 и 0 изменятся, используется ли результат как булевский?
              Ответить
      • Скорее всего ошибка, должно быть a > factor || …
        Ответить
        • ошибку совершили ещё раньше ... когда зачали того, кто это написал
          Ответить
    • злой тред?
      Ответить
      • нет, просто тред дятлов
        Ответить
        • >тред дятлов
          Тут я вижу достаточно разумные размышления есть. Нечего на carsten, gegMOPO4 и absolut вешать некрасивый ярлык.
          Ответить
          • таймстампы сообщений сравните. (подводом мыши)
            Ответить
            • хаха, я вас троллил

              ps: >подводом мыши
              Спасибо, не знал.
              Ответить
              • >хаха, я вас троллил

                ???
                Ответить
                • Mr. Vas Trollil
                  Ответить
                  • /(?:Pascal|Delphi|PHP|dos|mac|Windows|Linux)Govno/
                    Ответить
                    • >dos|mac
                      Чем же эти оси не заслужили начинаться с большой буквы?

                      И что здесь в списке делают языки? Неужели вы предрекаете их появление?
                      Ответить
                      • http://govnokod.ru/user/2890
                        http://govnokod.ru/user/2895
                        Ответить
                        • /(?:Pascal|Delphi|C_Plus_Plus_|PHP|dos|mac|Windows|Linux)Govno/


                          Delphi точно видел, по-моему ещё *Govno есть
                          Ответить
                          • только списка браузеров не хватает для полного набора
                            Ответить
                          • dos зелёный, а mac черный?
                            Может наоборот?
                            Ответить
                      • Языки это для олдовых.
                        Впрочем, это было быстро разъедено раком, eg: PHPGovno - чистой воды тавтология.
                        Ответить
                  • Mr. Yavas Trollil
                    Ответить
    • Без контекста придирка не катит.

      Если функция, в которой встретился этот код, имеет именно булевскую семантику (т.е. возвращает булевский по своей сути результат), то тогда, конечно, использование оператора '?:' не обосновано и лишь запутывает код.

      Если же эта функция имкеет численную сементику (т.е. например возвращет некий коэффициент, который просто по стечению обстоятельств оказался равен либо 0, либо 1), то все становится наоборот: правильно реализовывать именно так, как приведено выше, с использованием оператора '?:'.

      В последнем случае оно, конечно, будет работать и без '?:', т.к. "истина" в Си - это 1, а ложь - это 0, но тем не менее подобное смещение булевского и численного контекстов есть бессмысленное хакерство, говнокодинг и запутывание кода.
      Ответить
      • вот только основная придирка, думаю в использовании (а >= factor || (a ==...
        Ответить
      • >тем не менее подобное смещение булевского и численного контекстов есть бессмысленное хакерство, говнокодинг и запутывание кода.
        То-то же, а меня местные говнохакеры минусуют :) Но ещё придирка в самом условии -- вторая часть никогда не выполнится.
        Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить
    • показать все, что скрытоvanished
      Ответить

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