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