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!?
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!?
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.
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. –
@JensGustedt Ist das Verhalten nicht undefiniert, wenn Sie keine kompatiblen Objekte verwenden. – 2501
@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 *'. –
Sie sollten zuerst erklären, warum Sie annehmen: a == b. – 2501
Es ist Big Endian vs Little Endian. Es wird deutlicher, wenn Sie hex verwenden: 'a' ist' 0x66747970' und 'b' ist' 0x70797466'. – Cornstalks
vielen Dank. dieser ist Gradhilfe für mich. – codeDom