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++.

W C:

#include <stdio.h>
int main()
{
    printf("Size of char : %d\n", sizeof(char));
    return 0;
}

W C++:

#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;
}

Wyjście:

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;
}

Wyjście:

Size of char : 1
Size of char : 1

Dlaczego sizeof('a') zwraca różne wartości w C i C++?

 311
Author: Ayxan Haqverdili, 2010-01-31

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.

 358
Author: Eric Postpischil,
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

 30
Author: David R Tribble,
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
 22
Author: Smith,
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 typ char 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.

 7
Author: msc,
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