1. C++ / Говнокод #11893

    +32

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    #include <iostream>
     
    void f(char c)          { std::cout << "f(char)" << std::endl; }
    void f(signed char c)   { std::cout << "f(signed char)" << std::endl; }
    void f(unsigned char c) { std::cout << "f(unsigned char)" << std::endl; }
     
    int main()
    {
            f('a');
            f((signed char)('a'));
            f((unsigned char)('a'));
            return 0;
    }

    илитный ресурс сегодня мне раскрыл глаза на очередное крестоблядство керниган-гай-ричи-блядство:
    с:
    The implementation shall define char to have the same range, representation, and behavior as either signed char or unsigned char.
    Irrespective of the choice made, char is a separate type from the other two and is not compatible with either.
    с++:
    Characters can be explicitly declared unsigned or signed. Plain char, signed char, and unsigned char are three distinct types.

    Запостил: defecate-plusplus, 08 Октября 2012

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

    • И ты этого не знал? Ололо...
      Ответить
      • PS: Как всегда плюсую топики с крестоблядством и говном в языках.
        Ответить
      • да вот же
        всю жизнь хватало char vs unsigned char (которые могут представляться одинаково, но это никому не мешало)
        не мешало в т.ч. потому, что http://ideone.com/5XpeG
        Ответить
    • НО ЗАЧЕМ???
      Ответить
      • элегантно разрулили то, что одна имплементация хочет считать все символы больше #127 - отрицательными и ничтожными, а другая - полезными и бНОПНЯ
        и это вместо того, чтобы запретить отрицательные символы, а всех кто считает иначе - предать анафеме
        Ответить
        • Причем несмотря на то, что все char'ы разные, int эквивалентен signed int, а long - signed long. С++ логичный язык.
          Ответить
          • При чём тут С++? Когда этот идиотизм костыль принимался, плюсов ещё и в помине не было:)
            Ответить
            • В С с этим особых проблем нет, т.к. там нет перегрузки. И там, в зависимости от опции, char неотличим либо от signed-char либо от unsigned-char.

              В с++ ситуация более сложная, т.к. есть перегрузка, и именно там эти типы сделали различными, чтобы можно было писать одну перегрузку с char а не по две перегрузки каждой функции с unsigned char и signed char, которые программисты вечно бы забывали.
              Ответить
              • Я из-за c, sc и uc никогда прооблем не испытывал, но об этом нужно знать, ага
                Ответить
      • Погадаю на кофейной гуще: char - для символов, unsigned char и signed char - для чисел. Другой логики я не вижу :)
        UPD: только после отправки понял, что написал x..ню.
        Ответить
        • > UPD: только после отправки понял, что написал x..ню.
          Где тут х..ня, Xom94ok?

          Вроде как все верно - char для символов, где на знаковость почти наплевать, и она рулится опцией компилятора/дефолтами, а signed char и unsigned char для чисел, где важна знаковость. По мне так адекватное предположение.

          Вот только какого х.я по дефолту символы знаковые? Русские буквы во всяких там однобайтовых кодировках так удобно было проверять на диапазоны из-за этих минусов...
          Ответить
          • >Вот только какого х.я по дефолту символы знаковые?
            В разных системах может быть по-разному.
            Ответить
        • >для символов, unsigned char и signed char - для чисел. Другой логики я не вижу :)
          Тоже не считаю это хуйней.
          Ответить
          • только вот комитет с вами не согласен
            char, signed char и unsigned char - это все символы
            они вводятся и выводятся как символы
            Ответить
            • Считаю логику комитета по данному вопросу хуйней.
              Ответить
            • http://ideone.com/N92dW
              Ответить
              • О, ссылки стали зелёными?
                Надо скачать свежую версию либастрала, с поддержкой зелёных ссылок.
                Ответить
              • эх, слабоват наброс
                Ответить
              • ссылка должна быть синей http://ideone.com/U3hyq
                а компилятор С++
                Ответить
              • У вашего компилятора крестики отвалились.
                Ответить
              • Интересно, код один, подсветка разная. return в С++ это другой return?
                Ответить
                • а sizeof и типы не смутили?
                  вообще, конечно, глазастый ;)
                  Ответить
      • потому что традиционно все С компиляторы имеют свитч, которым можно в программе все char'ы сделать signed или unsigned.

        в С++ для совместимости это похоже так и унаследовали, но с расширением: char это то что девел свичами компилера регулирует и совместимо с С, unsigned char это всегда 0..255, signed char это всегда -128..127.

        но к слову я как бы не уверен что это по стандарту так. в GCC это именно так. но в паре комерческих С++ компиляторов с которыми я работал, свичом реально меняется char на signed/unsigned char. что есть весьма бесполезно и почему на свиче в доке стоит большой варнинг: типа ломает сигнатуры, использовать только для С кода.
        Ответить
        • > девел свичами компилера регулирует

          Вот ду ю сей браза ай донт андестэнд ю.
          Ответить
          • GCC:
            $ gcc --help -v  2>/dev/null | grep signed-char | grep default
              -fsigned-char               Make "char" signed by default
              -funsigned-char             Make "char" unsigned by default


            SunStudio:
            $ CC -help | grep xchar
            -xchar=<a>            Treat type char as signed or unsigned; <a>={s|signed|u|unsigned}


            IBM's xlC:
            $ man xlC
            ---- snip ----
                     -qchars={signed|unsigned}
                            Specifies whether the data type char will be signed
                            or unsigned.
            
                            Default: -qchars=unsigned
            ---- snip ----


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

              Разработчик выставляет флаги компилятора.
              Ответить
              • хуже. я в германии работаю. мне постоянно на трех языках приходится работать/разговаривать/думать. на это мои мозги просто не способны - у меня очевидно лимит два языка.

                другими словами, то что ты видишь это перевод с немецко-англиского (с французским акцентом) на русский (с беларуским дзыканьем) :)
                Ответить
    • Интриги! Сенсация! Наследование! Шок! Крестобляди не знаю своего языка. ЧИТАТЬ ДАЛЬШЕ>>>
      Ответить
      • Шок! Пользователи Lynx не могу сделать скриншот страницы.
        Ответить
        • У меня из консоли Lynx по нажатию PrnScr скриншотица на принтер. Иксы и DWM поставлю завтра.
          Ответить
          • Раз не умеешь без иксов делать скриншоты консоли,
            то фоткай на телефон, с супом.
            Ответить
            • У меня телефон только звонит.
              Ответить
              • Значит на фотоаппарат.
                Ответить
                • А фотоаппарат в его "линуксе" всяко не определяется.
                  Ответить
                  • Отговорок может быть куча. Например фотоаппарата нет.
                    Но виртуальное ж есть: /dev/vcs
                    Или гумно настолько нищеброд, что не может позволить себе виртуальное устройство?
                    Ответить
                    • Я всё ещё на работе. Линуха там нет и сейчас не нужен. Как приду домой - так сделаю скрины.
                      Ответить
                      • Теперь тебе осталось добавить, что ты нас троллил и всё - Урсус бы тобой гордился.
                        Ответить
                        • Приму 3е место премии Усруса. Возьму с полочки пирожок
                          Ответить
                          • Ок. Будет тебе 3-е место в списке обосравшихся при всем народе мудаков.
                            Все согласны?
                            На этом сайте есть только говно, его ты и получаешь в приз - употребляй сколько душе угодно.
                            Ответить
                            • Одно дело просто обосраться, а другое - круто обосраться.
                              Ответить
                              • Да. Кстати всё как в том анекдоте - такой мудак, что даже на конкурсе мудаков занял второе место.

                                Так вот тут ситуация точь-в-точь - в списке публично осрамившихся поделил 2-3 места с HaskellGovno.
                                Ответить
        • А кстати правда, на 12 Убунте и производных типа Минта скриншот не сделать, даже в фрейм-буффер не залезть, если десктоп рендерится через dri. Проблема как бы существует :)
          Ответить
          • Охщи. Как ты тонко меня спалил. Надеюсь моя Убунта за линукс считается?
            Ответить
          • там как минимум есть gimp, из которого можно сделать скриншот.
            Ответить
            • Не поможет. там фишка в другом, если dri используется то получить картинку с экрана просто неоткуда :) Виноват, как обычно, Х. Т.е. сервер сам картинку даже не собирает, он перенаправляя все вызовы видеокарточке - а она уже как соберет, так и будет. У меня вообще, например, при смене драйверов к видеокарточке менялся размер шрифтов, сглаживание и все такое. У Х этой информации просто нету, а как спросить у видеокарточки - ну, не знаю, я в ОГЛ не силен, может есть какие функции для этого, но выглядит на первый взгляд заморочливо...
              Так что ни ГИМП, ни ИмиджМаджик не помогут - им тоже неоткуда это взять. Они могут только если композиция делается процессором, т.е. софтовая эмуляция ОГЛ.

              А фишка эта еще и потому, что новые "навороченные" десктопы типа третьего гнома + юнити и т.п. решили, что им просто необходимы шейдеры и все такое. И теперь они отрисовываются через dri - ну вот и получилось...
              Ответить
              • Вы так говорите, как будто у видеокарты нельзя запросить содержимое фреймбуфера... Это скорее баг DRI в fglrx, нежели невозможность такой операции.

                P.S. На нвидии в юнити спокойно делаю скрины (к примеру скрин lynx в недавнем треде).

                P.P.S. А ну хотя у меня DRI вроде и выключен, но включен GLX, домой приду - проверю.
                Ответить
                • Я когда говорил про фрейбуффер, имел в виду виртуальный фреймбуффер у Х, а не видеокарточки.
                  Я так себе представляю, что драйвер должен предоставлять такую возможность, как сделать скриншот :) очевидно он этого не делает / делает не правильно. А больше получить это не от куда.
                  Ответить
            • Уточнение, это только актуально для АМД карточек с fxglr драйверами (но с другими не поиграешь, например, да и десктоп будет плохо выглядеть). Хотя, с АМД вообще не особо поиграешь... так что :|
              Ответить
              • Для меня отзывчивость интерфейса и ориентированность на клавиатуру всегда была важнее красивостей, поэтому, видимо, и принтскрин всегда работал
                Ответить

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