Размер символа (‘a’) в C / C ++

Каков размер символов на C и C ++? Насколько я знаю, размер char равен 1 байту как в C, так и в C ++.

В C:

#include  int main() { printf("Size of char : %d\n",sizeof(char)); return 0; } 

В C ++:

 #include  int main() { std::cout<<"Size of char : "<<sizeof(char)<<"\n"; return 0; } 

Никаких сюрпризов, оба из них дают результат: Size of char : 1

Теперь мы знаем, что символы представлены как 'a' , 'b' , 'c' , '|' , … Поэтому я просто модифицировал приведенные выше коды:

В C:

 #include  int main() { char a = 'a'; printf("Size of char : %d\n",sizeof(a)); printf("Size of char : %d\n",sizeof('a')); return 0; } 

Вывод:

 Size of char : 1 Size of char : 4 

В C ++:

 #include  int main() { char a = 'a'; std::cout<<"Size of char : "<<sizeof(a)<<"\n"; std::cout<<"Size of char : "<<sizeof('a')<<"\n"; return 0; } 

Вывод:

 Size of char : 1 Size of char : 1 

Почему sizeof('a') возвращает разные значения в C и C ++?

4 Solutions collect form web for “Размер символа (‘a’) в C / C ++”

В C тип символьной константы, такой как 'a' , фактически является int , с размером 4 (или некоторым другим значением, зависящим от реализации). В C ++ тип char , с размером 1. Это одна из многих небольших различий между двумя языками.

Как сказал Павел, это потому, что 'a' – это int в C, но char в C ++.

Я рассказываю об этой конкретной разнице между C и C ++ в том, что я написал несколько лет назад, по адресу: http://david.tribble.com/text/cdiffs.htm

В C тип символьных литералов – int и char в C ++. Это на C ++, необходимое для поддержки перегрузки функций . См. Этот пример:

 void foo(char c) { puts("char"); } void foo(int i) { puts("int"); } int main() { foo('i'); return 0; } 

Вывод:

 char 

В языке C символьный литерал не является типом char . C рассматривает символьный литерал как целое. Таким образом, нет разницы между sizeof('a') и sizeof(1) .

Таким образом, литерал sizeof character равен sizeof integer в C.

В языке C ++ символьный литерал является типом char . Cppreference говорит:

1) буквенный буквенный или обычный символ буква, например 'a' или '\n' или '\13' . Такой литерал имеет тип char и значение, равное представлению c-char в наборе символов выполнения. Если c-char не представляется в виде одиночного байта в наборе символов выполнения, литерал имеет тип int и значение, определяемое реализацией.

Итак, в C ++ символ literal – это тип char . поэтому размер символьного литерала в C ++ – это один байт.

Alos. В ваших программах вы использовали неверный спецификатор формата для оператора sizeof .

C11 §7.21.6.1 (P9):

Если спецификация преобразования недействительна, поведение не определено.275) Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.

Таким образом, вы должны использовать спецификатор %zu format вместо %d , иначе это неопределенное поведение в C.

  • segmentation fault с помощью scanf
  • Почему вы не можете использовать ключевое слово «this» в статическом методе в .Net?
  • SqlException из Entity Framework - новая транзакция не допускается, поскольку в сеансе есть другие streamи
  • Как я могу вернуть анонимный тип из метода?
  • URL-кодированная косая черта в URL-адресе
  • Как округлить десятичное значение до двух знаков после запятой (для вывода на страницу)
  • Как обнаружить события click / touch в пользовательском интерфейсе и GameObjects
  • Когда называется деструктор C ++?
  • Загрузить изображение с сайта в .NET / C #
  • Компиляция C ++ 11 с g ++
  • Зачем использовать начальные и конечные функции не-членов в C ++ 11?
  • Interesting Posts

    Как настроить 4K TV через HDMI на мой компьютер? (Получение задержки мыши / видео)

    Как использовать UrlFetchApp с учетными данными? Скрипты Google

    Как рисовать с помощью png в качестве фона?

    Могу ли я использовать 2 рекламных строки одновременно?

    Есть ли название для кнопок закрытия, минимизации и восстановления?

    Как регистрировать запросы PostgreSQL?

    Красный и синий меняются на Youtube

    Как (S) FTP на скрытый сервер?

    OSX: Snort: ERROR: /etc/snort/../rules/local.rules(0) Не удается открыть файл правил «/etc/snort/../rules/local.rules»: такого файла или каталога нет

    Сначала препроцессор C комментирует или расширяет macros?

    Как изменить размер окна, чтобы он был больше физического экрана?

    Установка Adobe Flashplayer на Ubuntu

    jQuery Отложенное – ожидание выполнения нескольких запросов AJAX

    Является ли строка stdout буферной, небуферизованной или неопределенной по умолчанию?

    Любая разница между java.time.Clock.systemDefaultZone (). GetZone () vs java.util.TimeZone.getDefault (). ToZoneId ()?

    Давайте будем гением компьютера.