Rozmiar znaku ('a') w C / C++
Jaki jest rozmiar znaku w C i C++ ? Z tego co wiem rozmiar char to 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;
}
No surprises, both of them gives the output: Size of char : 1
Teraz wiemy, że znaki są reprezentowane jako 'a'
,'b'
,'c'
,'|'
,... Dlatego właśnie zmodyfikowałem powyższe kody na te:
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++?
4 answers
W C, typ znaku stała Jak {[0] } jest w rzeczywistości int
, O rozmiarze 4 (lub innej wartości zależnej od implementacji). W C++ typem jest char
, O rozmiarze 1. Jest to jedna z wielu niewielkich różnic między tymi dwoma językami.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-09 18:02:11
Jak stwierdził Paul, to dlatego, że 'a'
jest int
W C, ale char
W C++.
Opisuję tę specyficzną różnicę między C i c++ w czymś, co napisałem kilka lat temu, pod adresem: http://david.tribble.com/text/cdiffs.htm
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-08-13 19:42:36
W języku C literały znaków to int i char w języku C++. Jest to w C++ wymagane do obsługi przeciążenia funkcji. Zobacz ten przykład:
void foo(char c)
{
puts("char");
}
void foo(int i)
{
puts("int");
}
int main()
{
foo('i');
return 0;
}
Wyjście:
char
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-20 07:41:12
W języku C literał znakowy nie jest typem char
. C traktuje znak literalny jako liczbę całkowitą. Nie ma więc różnicy między sizeof('a')
A sizeof(1)
.
Tak więc, rozmiar literała znaku jest równy rozmiarowi liczby całkowitej w C.
W języku C++ literał znakowy jest typem char
. cppreference say ' s:
1) znak wąski literalny lub zwykły literalny, np.
'a'
lub'\n'
lub'\13'
. Takie dosłowne ma typchar
i wartość równa reprezentacja C-char w zestawie znaków wykonawczych. Jeśli c-char jest nie można reprezentować jako pojedynczy bajt w zestawie znaków wykonawczych, literal ma typ int i wartość zdefiniowaną w implementacji.
Zatem w C++ literał znakowy jest typem char
. tak więc, rozmiar znaków literalnych w C++ jest jednym bajtem.
Alos, w swoich programach użyłeś niewłaściwego formatu dla operatora sizeof
.
C11 §7.21.6.1 (P9) :
Jeśli specyfikacja konwersji jest nieprawidłowa, zachowanie jest undefined.275) Jeśli jakikolwiek argument nie jest prawidłowym typem dla odpowiednia Specyfikacja konwersji, zachowanie jest niezdefiniowane.
Należy więc użyć specyfikatora formatu %zu
zamiast %d
, w przeciwnym razie jest to nieokreślone zachowanie w C.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-01 11:20:25