1. Куча / Говнокод #11415

    +122

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    Уважаемые знатоки, вопрос такой:
    sizeof('a') для  С и Сpp имеет различное значение и это вам известно из 
    C99 Standard: 6.4.4.4 Character constants  Para 2
    и
    C++03 Standard: 2.13.2 Character literals Para 1. 
    
    Интересует ваше предположение/мнение/версия/etc, для чего такое приняли?

    Стандартоособенности и внезапнонесовместимости.

    Запостил: sayidandrtfm, 15 Июля 2012

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

    • Для крестоблядства же.
      Ответить
      • Тарас, твоя лень скачать стандарты тебя снова подвела
        вышеописанный пример - чистой воды сиблядство
        Ответить
    • Для полноты картины:
      http://ideone.com/GDrwT
      Ответить
    • http://stackoverflow.com/questions/11150713/c-explain-sizeof-behaviour
      Ответить
    • sizeof('abcde') в С++?

      http://ideone.com/qNQsi
      Ответить
      • c++98 2.13.2 1
        An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal has type int and implementation-defined value.

        Что не так?
        Ответить
      • Более того, если текущая кодировка мультибайтовая, то для символов, хоть и выглядящих как один, но состоящих из нескольких байт, будет использоваться multicharacter literal:
        cout << sizeof('ы') << endl; // 4
        cout << sizeof('z') << endl; // 1
        http://ideone.com/N4GrL
        P.S. gcc даже без -Wall ругается на мультибайтовые символы, т.к. они скорее всего будут работать не так, как планировал автор...
        Ответить
      • sizeof('abcde') - UB. Точнее определено, но это определяется реализацией компилятора.
        Ответить
        • > Точнее определено, но это определяется реализацией компилятора.
          См. цитату из стандарта выше - sizeof определен и равен sizeof(int), не определено только его значение...

          P.S. Сама необходимость этих multicharacter literals под сомнением (кроме, конечно, случая с префиксом L - к примеру, L'ы', если текущая кодировка utf-8).
          Ответить
          • >Сама необходимость этих multicharacter literals под сомнением
            lolchto?
            Это строки времени компиляции.
            http://liveworkspace.org/code/b0f392d394ac540f53bf4404f006bef7
            Ответить
            • > Это строки времени компиляции.
              Лолчто? Разработчики стандарта явно не для этого извращения их придумали...

              P.S. Да и не было бы их - запилили бы как mpl::string<'k', 'o', 'k', 'o', 'k', 'o'>. Я имел в виду вменяемые применения, а не для троллинга компайл-тайм строками, порезанными на платформозависимое число групп.
              Ответить
            • P.S. Не поленился, проверил - mpl::string работает и без этих самых мультисимволов. И без произвольным образом выбранного размера группы - почему 4 символа то? Русские по 2 группировать, а китайские по одному? Это если еще учитывать, что собирать будут только на 32битных процессорах...
              http://liveworkspace.org/code/d73d9dac60a5689018b315b7584698bd
              http://liveworkspace.org/code/1b2c1f015793bdb1355105d0cbdcc1f1
              Ответить
              • Ты меня затроллел. У меня батхерт.
                Ответить
    • @sayidandrtfm, рискну предположить, что в с++ переделали тип литерала в char, чтобы в случаях, когда функция перегружена и для int и для char, литерал 'a' попадал в версию для char.
      Ответить
      • Перегрузку можно было сделать и без изменения размера.

        Как пример типы long и void*. Т.е. длинное целое и указатель.
        Эти типы имеют одинаковый размер (4 на моей системе) и с перегрузкой проблем не вызывают.
        Ответить
        • ты не понял, размеры char как раз и там и там одинаковые и равны 1
          только вот в си 'a' это int, а не char
          поэтому f('a') вызовет f(int), а не f(char)
          Ответить
          • Спасибо. Много всего ещё о Си не знаю.

            Ну тогда bormand бправ.
            Ответить
      • Версия такая: вспомнился сишный int по умолчанию, похоже что сделали «не знаешь какой тип правильнее - пиши инт».
        Т. е. в никаких сишных операция это ни на что не влияет — пусть будет интом.
        Поэтому, плюсовая версия с перегрузкой функций кажется адекватной - непосредственная необходимость.
        Ответить

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