Jaka jest wielkość znaków w C i C ++? O ile mi wiadomo rozmiar char wynosi 1 bajt zarówno w C, jak i 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;
}
Żadnych niespodzianek, oba dają wynik: Size of char : 1
Teraz wiemy, że znaki są reprezentowane 'a'
, 'b'
, 'c'
, '|'
, ... Więc po prostu zmodyfikowany powyższe kody do nich:
W 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
W 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
Dlaczego sizeof('a')
zwraca różne wartości w C i C ++?
"%|"
Format wymagaint
argumentu (lub coś, co promuje sięint
).sizeof
daje wynik typusize_t
. Przekształć naint
użycie rzutowania lub, jeśli twoja implementacja to obsługuje, użyj"%zu"
.Odpowiedzi:
W C, typ postaci stałej jak
'a'
jest w rzeczywistościint
, o rozmiarze 4 (lub inną wartość zależna od implementacji). W C ++ typ machar
rozmiar 1. Jest to jedna z wielu małych różnic między tymi dwoma językami.źródło
int
nachar
, co wyjaśnia zachowanie. :)Jak stwierdził Paul, to dlatego, że
'a'
jestint
w C, alechar
w C ++.Omawiam tę konkretną różnicę między C i C ++ w czymś, co napisałem kilka lat temu, pod adresem : http://david.tribble.com/text/cdiffs.htm
źródło
W C typ literałów znakowych to int i char w C ++. Jest to w C ++ wymagane do obsługi przeładowania funkcji . Zobacz ten przykład:
Wynik:
źródło
W języku C dosłowność znaków nie jest
char
typem. C uważa literał literowy za liczbę całkowitą. Tak więc nie ma różnicy międzysizeof('a')
isizeof(1)
.Wielkość literału znaków jest więc równa rozmiarowi liczby całkowitej w C.
W języku C ++ literał znaków jest rodzajem
char
. Cppreference Saya:Tak więc w języku C ++ literał jest rodzajem
char
. więc rozmiar literału znaków w C ++ to jeden bajt.Alos, W swoich programach użyłeś niewłaściwego specyfikatora formatu dla
sizeof
operatora.C11 §7.21.6.1 (P9):
Tak więc powinieneś użyć
%zu
specyfikatora formatu zamiast%d
, w przeciwnym razie jest to niezdefiniowane zachowanie w C.źródło
%zu
nie jest obsługiwany na wielu platformach, ale lepsza przenośność, użycie(int)sizeof(char)
i format%d
char
typ jest domyślnie podpisany czy niepodpisany.