Achten Sie darauf, über den Vorrang von * und ++ in C / C ++, (und jeder Tastendruck, wenn die Programmierung) [geschlossen]

StackOverflow https://stackoverflow.com/questions/3110140

Frage

Jemand schreibt diese Funktion

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    *p++;                //<-- Line to pay attention
  }
}

Ich fragte, warum Sie die * vor p setzen Sie ++?

Antwort: weil „Es ist das gleiche“, korrigierte ich den Code und dann wütend bleiben für eine Weile, weil beide wirklich die gleiche Arbeit ...

void strToUpper(char *p) {
  while (*p) {
    *p = TOUPPER(*p);
    p++;                //<-- Line to pay attention
  }
}

So würde Ich mag diese teilen mit Stackoverflow, Beispiel:

char s [6] = "Hallo";

Was würde es tun?

*++ptr;

Dies wird das ++ Pre-Inkrement (über den Zeiger) auswerten und dann der Dereferenzierungsoperator *, so wird es einen char-Wert ‚e‘ (zweiter Brief von „hallo“) lassen (die in diesem Fall nicht verwendet und könnte eine Warnung auf Kompilierung erzeugen) und der Zeiger wird von dem ‚e‘ (Position 1)

werden zeigen

Was würde es tun?

*ptr++;

Dies ist ein wenig seltsam, weil es den Dereferenzierungsoperator * erstes auswerten wird, so wird es einen char-Wert ‚h‘ lassen (die weder in diesem Fall verwendet wird) und dann der ++ Nachinkrement (auf den Zeiger ), wird der Zeiger so (wieder) aus dem 'e' gerichtet sein (Position 1)

Was würde es tun?

ptr++;

Schließlich wird es kein L-Wert von char haben, aber es wird keine Warnung nicht erzeugen, wenn nicht verwendet wird, und der Zeiger wird von der ‚e‘ gerichtet sein (Position 1) zu.

Diese drei Formen machen das gleiche von der Zeigeradresse Sicht ..

IMHO Das ist das Schlimmste, was von einigen Computersprachen ist (fast alle) ..

„Es ist eine schlechte Hamming-Distanz zwischen Code und jedem Fehler“

Wir haben keine Redundanz bei der Programmierung, wenn Sie ein Gesetzbuch nehmen und schreiben zufällige Zeichen in, Es wird lesbar sein, aber wenn Sie zufällig eingeben, wenn die Programmierung, Sie einen Fehler erhalten, 100% Genauigkeit

War es hilfreich?

Lösung

++ hat Vorrang vor *. Aber ich stimme zu, es ist unklar, wenn Sie beide mischen in derselben Anweisung.

Andere Tipps

Nach dem Operator Vorrang in C wird ++ bewerten zuerst, und nur dann *. So in *p++, ptr erhalten ihren Wert inceremented, und dann wird die Anweisung, um den Wert des opbject zu erhalten, auf die ptr jetzt zeigt auf. Natürlich ist dies von ptr++ nicht anders, da Sie den Wert der Anweisung nicht verwendet werden.

Wer mischt ++, -., + = Usw. mit anderen Betreibern bereits lesbaren Code zu schreiben hat es versäumt, die Tatsache, dass sie werden Fehler es aus ist nichts anderes als sie aufgrund

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top