it-swarm.com.de

Größe des Zeichens ('a') in C / C ++

Wie groß sind die Zeichen in C und C++? Soweit ich weiß, beträgt die Größe von char in C und C++ jeweils 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 als 'a', 'b', 'c', '|' Dargestellt werden.

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 gibt die Funktion sizeof('a') in C und C++ unterschiedliche Werte zurück?

283
whacko__Cracko

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

323
anon

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

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

25
David R Tribble

In C sind die Zeichenliteraltypen int und char in C++. Dies ist in C++ erforderlich, um Funktionsüberladung zu unterstützen. Siehe dieses Beispiel:

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

Ausgabe:

char
16
Smith

In der Sprache C ist das Zeichenliteral kein char -Typ. C betrachtet das Zeichenliteral als Ganzzahl. Es gibt also keinen Unterschied zwischen sizeof('a') und sizeof(1).

Das Sizeof-Zeichenliteral ist also gleich Sizeof Integer in C.

In der C++ - Sprache ist das Zeichenliteral der Typ char. Die cppreference say's:

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

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

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

C11 §7.21.6.1 (P9):

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

Also solltest du %zu Formatbezeichner anstelle von %d, sonst ist es undefiniertes Verhalten in C.

5
msc