347 Stimmen

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

Wie groß ist die Größe eines Zeichens in C und C++? Soweit ich weiß, ist die Größe eines Zeichens 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;
}

Es gibt keine Überraschungen, beide geben das Ergebnis aus: Size of char : 1

Jetzt wissen wir, dass die Zeichen wie folgt dargestellt werden 'a' , 'b' , 'c' , '|' ,... Also habe ich gerade die oben genannten Codes zu diesen 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;
}

Sortie :

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

Sortie :

Size of char : 1
Size of char : 1

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

406voto

In C ist 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 char Dies ist einer der vielen kleinen Unterschiede zwischen den beiden Sprachen.

33voto

David R Tribble Punkte 11254

Wie Paulus sagte, liegt das daran, dass 'a' ist ein int in C, sondern ein char in C++.

Ich habe diesen speziellen Unterschied zwischen C und C++ in einem Artikel behandelt, den ich vor einigen Jahren geschrieben habe, unter: http://david.tribble.com/text/cdiffs.htm

23voto

Smith Punkte 649

In C sind die Arten von Zeichenliteralen int y char in C++. Dies ist in C++ erforderlich, um Unterstützung der Funktionsüberladung . Siehe dieses Beispiel:

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

Sortie :

char

8voto

msc Punkte 31899

In der Sprache C ist das Zeichen literal nicht ein char Art. C betrachtet Zeichenliteral als Ganzzahl. Es gibt also keinen Unterschied zwischen sizeof('a') y sizeof(1) .

Das Zeichenliteral sizeof ist also gleich der Ganzzahl sizeof in C.

In der Sprache C++ , Zeichenliteral ist Typ von char . Die cpp-Referenz sagt:

1) schmales Zeichenliteral oder gewöhnliches Zeichenliteral, z. B. 'a' o '\n' ou '\13' . Ein solches Literal hat den Typ char und den Wert, der dem Darstellung von c-char im Ausführungszeichensatz. Wenn c-char nicht als einzelnes Byte im Ausführungszeichensatz dargestellt werden kann, wird der Literal den Typ int und einen implementierungsdefinierten Wert.

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

Alos, in Ihren Programmen haben Sie den falschen Formatbezeichner für sizeof Betreiber.

C11 §7.21.6.1 (P9) :

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

Sie sollten also Folgendes verwenden %zu Formatbezeichner anstelle von %d , andernfalls handelt es sich um undefiniertes Verhalten in C.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X