Vergleich von char zu Int in c++
in c++, ist es in Ordnung, zu vergleichen, ein int in ein char aufgrund von impliziten Typumwandlung? Oder bin ich Missverständnis, das Konzept?
Kann ich zum Beispiel tun,
int x = 68;
char y;
std::cin >> y;
//Assuming that the user inputs 'Z';
if(x < y)
{
cout << "Your input is larger than x";
}
Oder müssen wir zuerst konvertieren Sie es in einen int?
so
if(x < static_cast<int>(y))
{
cout << "Your input is larger than x";
}
Vorsicht, dass es zulässig ist, dass
Bitte vermeiden Sie die magischen zahlen, zu schreiben, was du meinst: Nicht 68 sondern
sizeof(int) == 1
und dass char
ist unsigned, in dem Fall für beide Seiten umgewandelt unsigned int
. Das ist ungewöhnlich, obwohl.Bitte vermeiden Sie die magischen zahlen, zu schreiben, was du meinst: Nicht 68 sondern
'D'
. Auch wenn sizeof(int)>1
, hüten Sie sich vor der Implementierung definiert Fehler von char
.InformationsquelleAutor user3029001 | 2014-04-05
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kann man ja vergleichen
int
einigechar
, wie Sie können vergleichen, eineint
einigeshort
, aber Sie können es als schlechten Stil. Ich würde codeoder wie hast du
das finde ich ein bisschen zu ausführlich für den Fall, dass....
BTW, wenn Sie verwenden möchten, die bytes nicht als
char
beachten Sie auch dieint8_t
Typ (etc...) aus<cstdint>
Vergessen Sie nicht, dass auf einigen Systemen
char
sindsigned
standardmäßig, auf anderen sind Sieunsigned
(und man könnte eine expliziteunsigned char
vssigned char
).Unentgeltliche casts (vor allem im C-Stil) werden oft als schlechter Stil.
Hm, mein Kommentar war im Einklang mit Ihnen, während ich geschrieben. Später bearbeitet für die Antwort, obwohl sich das geändert. Verdammt.
InformationsquelleAutor Basile Starynkevitch
Das problem mit beide Versionen ist, dass man sich nicht sicher über den Wert, die Ergebnisse vom negativ/große Werte (die Werte, die negativ sind, wenn
char
ist in der Tat einsigned char
). Dies wird durch die Implementierung definiert, da die Implementierung legt fest, obchar
bedeutetsigned char
oderunsigned char
.Der einzige Weg, um dieses problem zu beheben, ist eine Umwandlung in die entsprechende signed/unsigned char geben erste:
oder
Weglassen dieser Besetzung wird das Ergebnis in der Umsetzung definierten Verhalten.
Persönlich bevorzuge im Allgemeinen die Verwendung von
uint8_t
undint8_t
bei der Verwendung chars als zahlen, genau wegen diesem Problem.Diese noch davon ausgegangen, dass der Wert der
(un)signed char
ist im Bereich des möglichenint
Werte auf Ihrer Plattform. Dies kann nicht der Fall sein, wennsizeof(char) == sizeof(int) == 1
(nur möglich, wenn einchar
ist 16 bit!), und Sie vergleichen signed-und unsigned-Werten.Um dieses problem zu vermeiden, sicherstellen, dass Sie verwenden entweder
oder
Dein compiler wird hoffentlich beschweren sich mit Warnungen über gemischte unterzeichnet den Vergleich, wenn Sie dies nicht tun.
PRECISION(UCHAR_MAX) < PRECISION(INT_MAX)
(wahrscheinlich in der Praxis)Recht, vergaß, Ecke Fall. Ich habe einen Hinweis auf dieses nun die Antwort. Hoffe es gefällt Euch.
InformationsquelleAutor cmaster
Ihren code kompiliert und Arbeit, für eine bestimmte definition der Arbeit.
Immer noch erhalten Sie möglicherweise unerwartete Ergebnisse, da
y
ist einchar
, was bedeutet, dass Ihre Fehler wird durch die Implementierung definiert. Das kombiniert mit unbekannter Größe von int wird führen zu viel Freude.Bitte auch schreiben, der char-Literale, die Sie wollen, schauen Sie nicht auf die ASCII-Tabelle selbst. Jeder Leser (Sie in 5 Minuten) werden dankbar sein.
Letzten Punkt: Vermeiden Sie gratuituous cast, Sie machen nicht alles besser und kann die Probleme verheimlichen, Ihr compiler würde normalerweise zu warnen.
InformationsquelleAutor Deduplicator
Den code, den Sie vorschlagen, wird kompilieren, aber ich empfehle die
static_cast
version. Mitstatic_cast
Sie helfen dem Leser zu verstehen, was Sie tun, zu vergleichen, um eine ganze Zahl.InformationsquelleAutor Ivaylo Strandjev