Forum: Compiler & IDEs C soll einer verstehen...


von Frank (Gast)


Lesenswert?

Bei folgenden Testcode kann man Zeile a und b (s. unten) variieren und
es funzt immernoch. Entweder ist "C" nicht konsequent oder ich sollte
lieber die Zeiger ner Uhr betrachten - die versteh ich nämlich.

#include <stdio.h>
#include "iostream.h"

void print_char(char c){
   cout<<c;
}

void print_string(char *c){
   while (*c != 0) {
      /* Variante 1 */
      print_char(*c); //Zeile a
      *c++;          //Zeile b
   }
}

int main(void){
   print_string("Hallo");
   return 0;
}
/*
Varinte 2
      print_char(*c++); //Zeile a
                        //Zeile b

Variante 3
      print_char(*c); //Zeile a
      c++;            //Zeile b
*/

von Peter Fleury (Gast)


Lesenswert?

Siehe Kapitel 5.5 der C-Bibel Kernighan/Ritchie

von Frank (Gast)


Lesenswert?

Muß ich mir wohl besorgen. Aber *c++ == c++ ??? Liegt irgendwie nahe,
daß *c++ den Inhalt inkrementiert und c++ den Pointer, oder nicht?

von Jörg Wunsch (Gast)


Lesenswert?

Nein, das wäre (*c)++.

Bei

*c++;

ist der Stern einfach eine Null-Anweisung, da Du das Ergebnis der
Dereferenzierung des Pointers nie benutzt.  Der Compiler wird bei
vernünftiger Optimierung daher den Pointer gar nicht erst
dereferenzieren, sondern nur noch um ein Objekt erhöhen.

von Peter Fleury (Gast)


Lesenswert?

>< *c++ == c++ ??
Nein aber
print_char(*c++);  == print_char(*c); c++;

>>daß *c++ den Inhalt inkrementiert
Nein, *c++ und c++ erhöhen den Pointer auf c

von Frank (Gast)


Lesenswert?

Im Zweifel also zum Klammeraffen werden*lach*

Danke für's auf die Sprünge helfen :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.