2016-04-07 9 views
-5
char *s; 
char buf [] = "This is a test"; 

s = strchr (buf, 't'); 

if (s != NULL) 
    printf ("found a 't' at %s\n", s); 
printf("%c\n",*s); 
printf("%c\n",*s++); 
printf("%c\n",*s++); 
printf("%c\n",*s++); 
printf("%c\n",*s++); 

Dieser Code gibt:Warum haben * s und * s ++ in der folgenden Situation den gleichen Wert?

found a 't' at test 
t 
t 
e 
s 
t 
Program ended with exit code: 0 

Aus meiner Sicht * s sollte t und * s ++ sollte e sein sein. Aber warum haben sie denselben Wert in diesem Code?

+5

Ist "Ihre Sicht" auf etwas basiert? –

+1

Postincrement bedeutet, führen Sie dann Inkrement. Try * (++ s) – sircodesalot

+0

s bedeutet die Anfangsadresse von String s, also sollte * s der Wert sein, der in der Adresse gespeichert ist. s ++ sollte die nächste Position von der Anfangsadresse von String s sein. –

Antwort

5

Im Ausdruck *s++, ++ ist die Post -increment Betreiber. Das bedeutet, geschieht folgendes, in Ordnung:

  • Der Wert von s
  • bekommen wird
  • Dann s
  • Dann erhöht wird, wird der alte Wert von s wird dereferenziert

So

printf("%c\n",*s);  // Prints the character at s 
printf("%c\n",*s++); // Prints the character at s 
         // ***and then*** increments it 

Sie werden beide das gleiche Zeichen drucken.


Wenn Sie Ihr Codebeispiel verhalten wie Sie denken, es sollte einfach die erste printf auf s ohne Nachinkrement entfernen:

     // s points to the 't' 

printf("%c\n",*s++); // Prints 't'. Afterward, s points to the 'e' 
printf("%c\n",*s++); // Prints 'e'. Afterward, s points to the 's' 
printf("%c\n",*s++); // Prints 's'. Afterward, s points to the 't' 
printf("%c\n",*s++); // Prints 't'. Afterward, s points to the NUL terminator 
1
printf("%c\n",*s++); 

ist (mehr oder weniger) entspricht

printf("%c\n",*s); 
s++; 

T deshalb sehen Sie 't' zweimal gedruckt.

Der Ausdruck i++ wertet zum aktuellen Wert voni, und als Nebeneffekt erhöht die Variable.


1. Mehr oder weniger, weil s wird nach *s aktualisiert werden ausgewertet, aber vor printf tatsächlich genannt. Genau dann, wenn der Nebeneffekt ++ angewendet wird, ist nicht angegeben, dass es sich vor dem nächsten Sequenzpunkt handelt. In diesem Fall tritt ein Sequenzpunkt auf, nachdem alle Funktionsargumente ausgewertet wurden und bevor die Funktion aufgerufen wird.

+0

Plus eine für das Heraufbringen von Sequenzpunkten. –