Каков размер символа на C и С++? Насколько я знаю, размер char равен 1 байту как в 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 и С++?
В C тип символьной константы, такой как 'a'
, на самом деле является int
с размером 4 (или некоторым другим значением, зависящим от реализации). В С++ тип char
с размером 1. Это одна из многих небольших различий между двумя языками.
Как сказал Павел, это потому, что 'a'
является int
в C, но a char
в С++.
Я расскажу о той конкретной разнице между C и С++ в том, что я написал несколько лет назад, по адресу: http://david.tribble.com/text/cdiffs.htm
В C тип символьных литералов int и char в С++. Это в С++ требуется для поддержки перегрузки функций. См. Этот пример:
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.
На языке С++ символьный литерал является типом 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.
%zu
не поддерживается на многих платформах, но лучше переносимость, используйте (int)sizeof(char)
и формат %d
char
подписанным или неподписанным по умолчанию.
"%|"
Формат требует аргументint
(или что-то, что продвигает кint
).sizeof
дает результат типаsize_t
. Либо преобразуйте вint
используя приведение, либо, если ваша реализация поддерживает это, используйте"%zu"
.