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

233

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

В C:

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

В С++:

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

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

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

В C:

#include <stdio.h>
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

В С++:

#include <iostream>
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 и С++?

  • 7
    "%|" Формат требует аргумент int (или что-то, что продвигает к int ). sizeof дает результат типа size_t . Либо преобразуйте в int используя приведение, либо, если ваша реализация поддерживает это, используйте "%zu" .
Теги:
types

4 ответа

252
Лучший ответ

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

  • 0
    Хорошо, не могли бы вы указать стандартную ссылку? :)
  • 0
    Это довольно общий ответ, учитывая приведенный выше код: P
Показать ещё 11 комментариев
24

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

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

  • 4
    Просто любопытно, но вы работаете над обновлением этого (очень подробного) документа, чтобы включить новые изменения в C ++ 11 и C11?
  • 0
    Не сейчас. Мой интерес к C и C ++ сильно снизился за последние пять лет или около того.
Показать ещё 1 комментарий
13

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

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

Вывод:

char
1

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

Итак, литерал sizeof character равен sizeof integer в C.

На языке С++ символьный литерал является типом char. cppreference говорят:

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

Итак, в С++ символьный литерал является типом char. поэтому размер символьного литерала в С++ - это один байт.

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

C11 §7.21.6.1 (P9):

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

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

  • 0
    %zu не поддерживается на многих платформах, но лучше переносимость, используйте (int)sizeof(char) и формат %d
  • 0
    Значение символьных литералов не обязательно соответствует соответствующему ASCII-коду. Это зависит от исходного и исполнительного наборов символов и от того, является ли тип char подписанным или неподписанным по умолчанию.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню