2010-11-30 5 views
6

Warum erlaubt mir C++ (und wahrscheinlich auch C), einem Char Zeichen zuzuweisen und int einzugeben, ohne mich wenigstens zu warnen?C++ Zuordnung eines int zu einem char - warum funktioniert das ohne zumindest eine Warnung?

Ist es in Ordnung, um direkt den Wert zuweisen, wie in

int i = 12; 
char c = i; 

das heißt eine implizite Konvertierung tun, oder soll ich ein static_cast<> benutzen?

EDIT

Btw, verwende ich gcc.

+7

Sie werden wahrscheinlich eine Warnung erhalten, wenn Sie Ihre Warnstufen erhöhen. –

+1

Ich stimme auch überein, warnende Niveaus anzukurbeln ist eine gute Idee. In jedem Fall, wenn Sie zuweisen müssen, verwenden Sie die static_cast , um klar zu sein – seand

+4

In GCC, erhalten Sie keine Warnung über mögliche Probleme bei der Typkonvertierung, bis Sie die '-Wconversion'-Flag verwenden (' -Wall' doesn ' t warne dies). In VC++ warnt '/ W4' vor einem möglichen Datenverlust bei dieser Konvertierung. – birryree

Antwort

7

Es wurde in C erlaubt, bevor eine explizite Cast-Syntax erfunden wurde. Dann blieb es eine übliche Praxis, also erbte C++ es, um nicht eine große Menge Code zu brechen.

Tatsächlich geben die meisten Compiler eine Warnung aus. Wenn dies nicht der Fall ist, ändern Sie die Einstellungen.

-3

char ist das gleiche wie kurz. Es sollte also eine Warnung vor einem möglichen Verlust von Informationen geben. Möglicherweise haben Sie Warnungen ausgeschaltet, versuchen Sie irgendwie Ihren Compiler/IDE zu konfigurieren.

+9

Das ist nicht unbedingt wahr, dass "sizeof (char) == sizeof (short)", und auf gemeinsamen Plattformen (x86), sind sie definitiv nicht die gleiche Größe. Die einzige Garantie, die Sie haben, ist "sizeof (short)> = sizeof (char)". – birryree

+3

char ist nicht gleich kurz. – ybungalobill

1

C wie ursprünglich entworfen war nicht wirklich ein strongly-typed language. Die allgemeine Philosophie war, dass Sie der Programmierer wissen müssen, was Sie tun, und der Compiler ist nur da, um Ihnen dabei zu helfen. Wenn Sie sechs oder sieben Mal in einem einzigen Ausdruck zwischen Float-, Int- und Unsigned-Zeichen konvertieren möchten, dann muss das das sein, was Sie wollten.

C++ Art von abgeholt, nur so dass alle vorhandenen C-Code wäre nicht zu viel von einem Bär zu Port. Sie versuchen jedoch langsam, es mit jeder Überarbeitung stärker zu machen. Heute wird Ihnen fast jeder C++ - Compiler eine Warnung dafür geben, wenn Sie die Warnstufen hochschalten (was ich Ihnen hoch empfehlen kann).

Andernfalls sollten Sie vielleicht in echte stark typisierte Sprachen wie Java und Ada schauen. Der äquivalente Ada-Code würde ohne eine explizite Konvertierung nicht kompilieren.

0

Kurze Antwort: Es ist okay (nach dem C++ Standard) in Ihrem Beispiel.
Etwas längere Antwort: Es ist nicht in Ordnung, wenn char signiert ist und Sie versuchen, ihm einen Wert außerhalb seines Bereichs zuzuweisen. Es ist in Ordnung, wenn es nicht signiert ist (ob char signiert ist oder nicht hängt von Ihrer Umgebung ab), dann erhalten Sie Modulo-Arithmetik. Compiler haben normalerweise einen Schalter, um dich wegen des ersten Falls zu warnen, aber solange du in den Grenzen bleibst, ist das völlig in Ordnung (eine explizite Besetzung, um deine Absichten klarzustellen, tut aber nicht weh).

Verwandte Themen