2013-06-13 6 views
6

Meine erwartete Ausgabe für u6.c war ABC, aber hier habe ich CBA warum ist es so? Könnten Sie das bitte mit einer ausführlichen Erklärung beleuchten?Warum druckt Reverse String?

union mediatech 
{ 
int i; 
char c[5]; 
}; 

int main(){ 
mediatech u1 = {2};    // 1 
mediatech u2 = {'a'};    // 2 
mediatech u3 = {2.0};    // 3 
mediatech u6 = {'ABC'};   // 6 

cout<<"\nu6.i = "<<u6.i<<" u6.c="<<u6.c; // o/p: u6.i=4276803 u6.c=CBA 
} 
+0

Related: http://StackOverflow.com/A/7459943/24913 –

+0

Beachten Sie, dass dies streng undefiniert Verhalten ist. In Ihrer cout-Anweisung lesen Sie von einem Gewerkschaftsmitglied, das nicht das zuletzt geschriebene war. –

Antwort

5

http://en.wikipedia.org/wiki/Little_endian#Little-endian

Sie verwenden wahrscheinlich Prozessor mit x86-Architektur :), die Little-Endian ist.

Es bedeutet, dass wenn Sie Char Charar Character zuweisen, sie in der gleichen Reihenfolge in den Speicher gehen, aber wenn Sie diesen Speicher als Integer lesen, geht es in umgekehrter Reihenfolge zum Prozessorregister.

Leider Edited, die gleiche, aber in umgekehrter Reihenfolge, man initialisiert ganze Zahl mit ‚ABC‘ multi-Zeichenliteral, die aus Prozessorregistern zum Speicher in umgekehrter Reihenfolge und als char Array geht es wird „CBA "

14

Sie verwenden einen Mehr Zeichenliteral 'ABC' eine int zu initialisieren.

Wie das Multi-Zeichen-Literal interpretiert wird (was eine ungewöhnliche Art der Verwendung von '' ist) ist implementation-defined. Insbesondere ist die Reihenfolge der einzelnen Zeichen in der int Interpretation implementierungsdefiniert.

Es gibt keine übertragbare (d. H. Implementierungsunabhängige) Möglichkeit, vorherzusagen, was dieses Programm in Bezug auf die Reihenfolge der Zeichen in 'ABC' macht.

Aus dem Standard (11 C++, §2.14.3/1):

[...] ein aus mehreren literal int und umsetzungs definierten Wert Typ aufweist.

+1

Darf ich vorschlagen, dass Multi-Zeichen-Literale eher "ungewöhnlich" als nicht-Standard sind. Immerhin zitieren Sie den Teil des Standards, der sie beschreibt ... –

+0

@KazDragon Sehr wahr. Bearbeitet. – jogojapan

+2

@jogojapan: +1 wusste nie über diesen literalen Typ, danke :) – legends2k