2014-12-21 5 views
6

Ich habe eine Verwirrung darüber, wie der Compiler eine Char-Variable mit mehreren Zeichen behandelt. Ich verstehe, dass ein Zeichen 1 Byte ist und ein Zeichen wie ASCII enthalten kann.Zeichen val = 'abcd'. Verwenden von Multi-Zeichen-Char

Aber wenn ich versuche:

char _val = 'ab'; 
char _val = 'abc'; 
char _val = 'abcd'; 

Sie kompiliert fein und wenn ich _VAL es immer druckt das letzte Zeichen zu drucken. Aber wenn ich

tat
char _val = 'abcde'; 

Dann bekam ich einen Compiler-Fehler:

Error 1 error C2015: too many characters in constant

Also meine Fragen sind:

  1. Warum der Compiler immer das letzte Zeichen nimmt, wenn mehrere Zeichen verwendet werden ? Was ist der Compiler-Mechanismus in dieser Situation?
  2. Warum habe ich einen zu viele Zeichen Fehler bekommen, wenn ich 5 Zeichen gesetzt habe. 2 Zeichen ist mehr als was ein Char kann also warum 5?

Ich bin mit Visual Studio 2013

Danke.

+1

Auf 1: "immer", nein, es ist die Implementierung definiert. Verschiedene Compiler werden verschiedene Dinge tun (aber immer das Gleiche). – usr2564301

+0

Wahrscheinlich, weil 4 'char's die Größe von 1' int' haben (auf den meisten Plattformen, einschließlich deins). So kann ein 'int'-Wert aus einer beliebigen Folge von bis zu 4' char's berechnet werden. Um diesen "int" -Wert einer "char" -Variablen zuzuweisen, wird er auf die Größe von "char" gekürzt (so wird nur das "am wenigsten signifikante" "char" kopiert). –

Antwort

9

[lex.ccon]/1:

An ordinary character literal that contains more than one c-char is a multicharacter literal. A multicharacter literal [..] is conditionally-supported, has type int , and has an implementation-defined value.


Why does the compiler always takes the last character when multiple characters are used? What is the compiler mechanism in this situation.

Die meisten Compiler verschieben nur die Zeichenwerte zusammen, um: auf diese Weise das letzte Zeichen das am wenigsten signifikante Byte belegt, das vorletzte Zeichen belegt das Byte neben dem niederwertigsten und so weiter.
I.e. 'abc' entspricht 'c' + ((int)'b')<<8) + (((int)'a')<<16) (Demo).

Umwandlung dieser int zurück in eine char wird eine Implementierung definierten Wert haben - von der Einnahme den Wert des int Modulo 256, die einfach Sie das letzte Zeichen geben würde, könnte nur entstehen.

Why did I get a too many characters error when I put 5 characters. 2 characters is more than what a char can handle so why 5?

Da auf Ihrem Rechner ein int ist wahrscheinlich vier Bytes groß. Wenn das Obige tatsächlich die Art ist, in der Ihr Compiler Mehrfachzeichen-Konstanten anordnet, kann er keine fünf char Werte in eine int setzen.