Размер символа ('a') в C / C ++ - PullRequest
280 голосов
/ 31 января 2010

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

В С:

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

В C ++:

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

Без сюрпризов, оба они дают вывод: Size of char : 1

Теперь мы знаем, что символы представлены в виде 'a', 'b', '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

В C ++:

#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 и C ++?

Ответы [ 4 ]

318 голосов
/ 31 января 2010

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

25 голосов
/ 13 августа 2012

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

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

16 голосов
/ 05 января 2015

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

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

Выход:

char
5 голосов
/ 01 ноября 2017

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

Таким образом, размер буквенного символа равен размеру целого числа в C.

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

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

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

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

C11 §7.21.6.1 (P9):

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...