
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?
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 char
mit der Größe 1. Dies ist einer von vielen kleinen Unterschieden zwischen den beiden Sprachen.
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

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

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 %d
andernfalls ist es ein undefiniertes Verhalten in C.
9964500cookie-checkZeichengröße (‘a’) in C/C++yes
Die
"%|"
Format erfordert einint
Argument (oder etwas, das fördertint
).sizeof
liefert ein Ergebnis vom Typsize_t
. Entweder umwandeln inint
Verwenden Sie eine Umwandlung oder verwenden Sie, wenn Ihre Implementierung dies unterstützt"%zu"
.– Keith Thompson
9. November 2011 um 19:55 Uhr