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