Unterschied zwischen ' und "
-
Hallo,
warum macht es einen Unterschied zwischen ' und "?
Ich wollte in einer If-Abfrage ein Vergleich durchführen, z.B. sowas
/* Vergleich funktioniert */ if (str[i] == 'a') /* Vergleich funktioniert nicht*/ if (str[i] == "a")
Es kann ja nicht daran liegen, dass ich nur einen Buchstaben vergleiche, oder?
Grüße,
simsa
-
simsa schrieb:
Es kann ja nicht daran liegen, dass ich nur einen Buchstaben vergleiche, oder?
Warum nicht?
In ' sind es Buchstaben und damit Ganzzahlwerte (char, int)
In " ist es ein Stringliteral und somit einconst char*
Das hängt also auch davon ab, wie str definiert ist.
Bei
char str[10]
ist ein Element ein char und du musst mit einer Ganzzahl vergleichen.Bei
char *str[10]
ist ein Element ein char* und du kannst mit einem Zeiger vergleichen.
Da werden allerdings die Zeiger verglichen und nicht der Inhalt auf den sie verweisen.Wenn du Strings vergleichen willst, dann nimm
strcmp
.Es gibt einen Unterschied zwischen 2 und '2' und "2".
-
DirkB schrieb:
In " ist es ein Stringliteral und somit ein
const char*
Genau genommen ist der Typ Array[N] von
char
(keinconst char
!)*, wobei die Länge N des Arrays gleich der Anzahl der Zeichen + 1 ist.sizeof("Blabla") == 7; // wahr char *foo = "Huhu!"; // erlaubt
*: Es ist jedoch undefiniert, was beim Verändern passiert. Also: Finger weg!
-
schau dir auch mal das Disassembly an, da kann man immer sehr schön erkennen, was aus irgendwelchen abstrakten Konstrukten von Hochsprachen tatsächlich wird.
char *string="HALLO"; char *testStr="A"; char testChar='A'; if(string[1]==testChar) // (1) { printf("(1) string[1]==testChar"); } if(string[1]==testStr) // (2) { printf("(2) string[1]==testStr"); }
zu (1)
mov BYTE PTR [esp+0x17],0x41 ; 0x41 ist das Zeichen 'A', wird in [esp+0x17]=testChar gespeichert ... cmp al,BYTE PTR [esp+0x17] ; byteweiser Vergleich zwischen string[1] (in al) und 'A' (in [esp+0x17]=testChar)
zu (2)
mov DWORD PTR [esp+0x18],0x8048516 ; 0x8048516 ist die Adresse von testStr, wird in [esp+0x18]=testStr gespeichert ... cmp eax,DWORD PTR [esp+0x18] ; Double Word Vergleich zwischen string[1] und der Adresse von testStr
Gut, ist jetzt wieder komplizierter geworden als ich das wollte.
Kurz gesagt:
(1) Vergleich zwischen 'A' und 'A'
(2) Vergleich zwischen 'A' und 0x8048516 (=Adresse von testStr)Wenn man dann an die Stelle 0x8048516 springt, sieht man außerdem, dass dort nicht nur ein 'A' steht, sondern ein 'A' und eine 0. Das heißt, "A" ==> 'A' + 0