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 ein const 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".


  • Mod

    DirkB schrieb:

    In " ist es ein Stringliteral und somit ein const char*

    Genau genommen ist der Typ Array[N] von char (kein const 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


Log in to reply