2016-07-02 19 views
4

Ich bin neugierig auf diesen Code:C - einfache Anführungszeichen vs doppelten Anführungszeichen

int a = 'ftyp';   // a == 1718909296 
int b = *((int*)"ftyp"); // b == 1887007846 

Meine Frage: Warum a = b!?

+1

Sie sollten zuerst erklären, warum Sie annehmen: a == b. – 2501

+3

Es ist Big Endian vs Little Endian. Es wird deutlicher, wenn Sie hex verwenden: 'a' ist' 0x66747970' und 'b' ist' 0x70797466'. – Cornstalks

+0

vielen Dank. dieser ist Gradhilfe für mich. – codeDom

Antwort

8
int a = 'ftyp';   // a == 1718909296 

Sätze a dem Mehrzeichenkonstante, die Umsetzung definierten Wert hat. Der Wert a ist nicht durch den Standard definiert. Weitere Informationen finden Sie unter Single quotes vs. double quotes in C or C++.

int b = *((int*)"ftyp"); // b == 1887007846 

ist Ursache für undefiniertes Verhalten wegen Verletzung strict aliasing.

Die Erwartung, dass a == b ist nicht fundiert.

+1

Nein, das Problem ist hier kein Aliasing. Aliasing wäre nur ein Problem, wenn ein Objekt mit Alias ​​geändert würde. Dann könnte der Compiler eine falsche Annahme machen, dass das Objekt, das er durch einen Zeiger sieht, nicht geändert wurde. Das eigentliche Problem ist hier mögliche Fehlausrichtung. –

+0

@JensGustedt Ist das Verhalten nicht undefiniert, wenn Sie keine kompatiblen Objekte verwenden. – 2501

+0

@JensGustedt, Von C + 11 Standard 3.10/10: * Wenn ein Programm versucht, auf den gespeicherten Wert eines Objekts über einen glvalue von einem der folgenden Typen zuzugreifen, ist das Verhalten nicht definiert *. Keine der folgenden Klauseln erlaubt den Zugriff auf den Wert eines String-Literals über ein 'int *'. –