Zeichengröße (‘a’) in C/C++

Lesezeit: 4 Minuten

Zeichengrose a in CC
whacko__Cracko

Was ist die Zeichengröße in C und C++? Soweit ich weiß, ist die Größe von char sowohl in C als auch in C++ 1 Byte.

In C:

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

In C++:

#include <iostream>
int main()
{
    std::cout << "Size of char : " << sizeof(char) << "\n";
    return 0;
}

Keine Überraschungen, beide geben die Ausgabe aus: Size of char : 1

Jetzt wissen wir, dass Zeichen dargestellt werden als 'a','b','c','|',… Also habe ich gerade die obigen Codes in diese geändert:

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

Ausgabe:

Size of char : 1
Size of char : 4

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

Ausgabe:

Size of char : 1
Size of char : 1

Warum zum sizeof('a') gibt unterschiedliche Werte in C und C++ zurück?

  • Die "%|" Format erfordert ein int Argument (oder etwas, das fördert int). sizeof liefert ein Ergebnis vom Typ size_t. Entweder umwandeln in int Verwenden Sie eine Umwandlung oder verwenden Sie, wenn Ihre Implementierung dies unterstützt "%zu".

    – Keith Thompson

    9. November 2011 um 19:55 Uhr

In C der Typ eines Zeichens Konstante wie 'a' ist eigentlich ein int, mit einer Größe von 4 (oder einem anderen implementierungsabhängigen Wert). In C++ ist der Typ charmit der Größe 1. Dies ist einer von vielen kleinen Unterschieden zwischen den beiden Sprachen.

  • Im C++ Standard ist es Abschnitt 2.13.2/1, in C 6.4.4.4, zumindest in der mir vorliegenden Dokumentation.

    anon

    31. Januar 2010 um 19:24 Uhr


  • +1 (Außer, dass die „Größe von 4“ zwar offensichtlich für die Plattform von nthrgeek gilt, aber nicht unbedingt für alle Plattformen.)

    – sbi

    31. Januar 2010 um 19:24 Uhr

  • @nthrgeek: Ich bin zu faul, beide Standards zu zitieren, aber der C++-Standard hat einen Anhang, der Inkompatibilitäten mit C gewidmet ist. Unter Anhang C.1.1 wird erwähnt, dass „Type of Character Literal geändert wurde von int zu char, was das Verhalten erklärt. 🙂

    – jalf

    31. Januar 2010 um 19:28 Uhr


  • @nthrgeek: §6.4.4.4, Absatz 10: „Eine ganzzahlige Zeichenkonstante hat den Typ int. Der Wert einer ganzzahligen Zeichenkonstante, die ein einzelnes Zeichen enthält, das einem Einzelbyte-Ausführungszeichen zugeordnet wird, ist der numerische Wert der Darstellung der Zuordnung Zeichen als Integer interpretiert.”

    – Stefan Kanon

    31. Januar 2010 um 19:41 Uhr

  • @nthrgeek: Sie sollten nicht nach einer Standardreferenz fragen, es sei denn, Sie haben einen Streit über einen bestimmten Punkt und Sie möchten verstehen, warum die andere Person eine andere Meinung hat. Wenn alle damit einverstanden sind, akzeptieren Sie es einfach. Sie (als Entwickler) sollten ziemlich intelligent genug sein, um selbst schnell eine gemeinsame Antwort wie diese zu finden.

    – Martin York

    1. Februar 2010 um 5:07 Uhr

Wie Paul sagte, liegt es daran 'a' ist ein int in C, aber a char in C++.

Ich behandle diesen spezifischen Unterschied zwischen C und C++ in etwas, das ich vor ein paar Jahren geschrieben habe, unter: http://david.tribble.com/text/cdiffs.htm

  • Nur neugierig, aber arbeiten Sie daran, dieses (sehr detaillierte) Dokument zu aktualisieren, um die neuen Änderungen in C++11 und C11 aufzunehmen?

    – Adam Rosenfield

    13. August 2012 um 20:15 Uhr

  • Nicht im Moment. Mein Interesse an C und C++ hat in den letzten fünf Jahren stark nachgelassen.

    – David R. Tribble

    20. August 2012 um 19:34 Uhr

  • Äh, ich habe Ihre Arbeit zum Schreiben verwendet Das und hier bist du auf SO. So eine kleine Welt!

    Benutzer405725

    9. Dezember 2013 um 18:04 Uhr

1647157210 281 Zeichengrose a in CC
Schmied

In C sind die Art der Zeichenliterale int und verkohlen in C++. Dies ist in C++ erforderlich Überlastung der Unterstützungsfunktion. Siehe dieses Beispiel:

void foo(char c)
{
    puts("char");
}
void foo(int i)
{
    puts("int");
}
int main()
{
    foo('i');
    return 0;
}

Ausgabe:

char

  • Interessantes Detail, das in den anderen Antworten nicht erwähnt wurde. Danke.

    – 0xC0000022L

    3. September 2020 um 8:04 Uhr

  • beste Erklärung, sollte die akzeptierte Antwort sein.

    – Sekomer

    5. Dezember 2021 um 12:46 Uhr

Zeichengrose a in CC
msc

In C-SpracheZeichenliteral ist kein a char Art. C betrachtet das Zeichenliteral als ganze Zahl. Es gibt also keinen Unterschied zwischen sizeof('a') und sizeof(1).

Das sizeof-Zeichenliteral ist also gleich sizeof integer in C.

In C++-SpracheZeichenliteral ist Typ von char. Die cpReferenz sagen:

1) schmales Zeichenliteral oder gewöhnliches Zeichenliteral, z 'a' oder
'\n' oder '\13'. Ein solches Literal hat einen Typ char
und der Wert gleich der Darstellung von c-char im Ausführungszeichensatz. Wenn c-char nicht als einzelnes Byte im Ausführungszeichensatz darstellbar ist, hat das Literal den Typ int und einen implementierungsdefinierten Wert.

In C++ ist das Zeichenliteral also ein Typ von char. Die Größe des Zeichenliterals in C++ beträgt also ein Byte.

Außerdem haben Sie in Ihren Programmen einen falschen Formatbezeichner für verwendet sizeof Operator.

C11 §7.21.6.1 (P9) :

Wenn eine Konvertierungsspezifikation ungültig ist, ist das Verhalten undefiniert.275) Wenn ein Argument nicht den richtigen Typ für die entsprechende Konvertierungsspezifikation hat, ist das Verhalten nicht definiert.

Sie sollten also verwenden %zu Formatbezeichner statt %dandernfalls ist es ein undefiniertes Verhalten in C.

996450cookie-checkZeichengröße (‘a’) in C/C++

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy