Размер символа ('a') в C/C++
Каков размер символов в C и C++? Насколько я знаю, размер символа составляет 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'
, '|'
... Так что я просто изменил приведенные выше коды к этим:
В С:
#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 ответа
В 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)
,
Таким образом, размер буквенного символа равен размеру целого числа в C.
В языке C++ символьный литерал является типом char
, Сговор говорит:
1) узкий буквенный или обычный буквенный символ, например
'a'
или же'\n'
или же'\13'
, Такой литерал имеет типchar
и значение, равное представлению c-char в наборе символов выполнения. Если c-char не может быть представлен как один байт в наборе символов выполнения, литерал имеет тип int и значение, определяемое реализацией.
Итак, в C++ символьный литерал является типом char
, Итак, размер символьного литерала в C++ составляет один байт.
Алос, в ваших программах вы использовали неверный спецификатор формата для sizeof
оператор.
C11 §7.21.6.1 (P9):
Если спецификация преобразования недопустима, поведение не определено.275) Если какой-либо аргумент не является правильным типом для соответствующей спецификации преобразования, поведение не определено.
Итак, вы должны использовать %zu
спецификатор формата вместо %d
в противном случае это неопределенное поведение в C.