Размер символа (‘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.

  • Можно ли вызвать функцию C из C # .Net
  • Константы и оптимизация компилятора в C ++
  • Лучший способ разрешить путь к файлу слишком долгое исключение
  • Измерение времени выполнения функции в C ++
  • .NET String.Format () для добавления запятых в тысячи мест для номера
  • Почему HttpContext.Current null после ожидания?
  • C # Async - Как это работает?
  • Используете ли вы какие-либо интерпретаторы C ++ (а не компиляторы)?
  • Является ли компилятор C # достаточно умным, чтобы оптимизировать этот код?
  • ASP.NET MVC - привязка объекта типа «MODELNAME» не удалась, поскольку другой объект того же типа уже имеет такое же значение первичного ключа
  • Список стандартных файлов заголовков в C и C ++
  • Interesting Posts

    Сохранить настройки в приложении .NET Winforms

    Ищете новый бесплатный брандмауэр (у Sunbelt есть огромная дыра)

    Замена приложения «Телефон по умолчанию» на Android 6 и 7 с помощью InCallService

    Как я могу направить * некоторый * трафик через прокси SSX SOCKS на OS X?

    Легкий способ восстановить папку Windows.old после обновления Windows 8 PC?

    Модернизация сетевых интерфейсов в Linux

    Каков самый чистый способ применения map () для словаря в Swift?

    отправка списка / карты в качестве параметра POST

    Как конвертировать PDF-документ в PNG?

    Тернарный (условный) оператор в C

    Почему бы не вывести параметр шаблона из конструктора?

    Могу ли я подключить концентратор USB 1.1 к розетке и зарядным устройствам?

    Рекомендации по parsingу файлов .eml в C #

    Как создать пользовательскую функцию EL для вызова статического метода?

    Внешний жесткий диск не пуст, но файлы не отображаются

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