Domanda

Qualcuno scrittura questa funzione

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

ho chiesto, perché si fa a mettere la prima * p ++?

Risposta: perché "E 'lo stesso", mi corresse il codice e poi rimanere arrabbiato per un po', perché entrambi funzionano davvero lo stesso ...

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

Quindi vorrei condividere questo con StackOverflow, esempio:

char s [6] = "ciao";

Che cosa sarebbe fare?

*++ptr;

Questa valuterà l'++ pre-incremento (oltre il puntatore) e poi l'operatore dereference *, in modo che vi permetterà un valore char 'e' (seconda lettera di "ciao") (che non viene utilizzato in questo caso e potrebbe generare un avviso sulla compilazione) e il puntatore punterà da la 'e' (posizione 1)

Che cosa sarebbe fare?

*ptr++;

Questo è un po 'strano, perché valuterà l'operatore dereference * prima, in modo che vi permetterà un valore char 'h'(che non è né utilizzato in questo caso), e poi il post-incremento ++ (al puntatore ), quindi (nuovamente) il puntatore punterà dal 'e' (posizione 1)

Che cosa sarebbe fare?

ptr++;

Infine, non avrà un lvalue di char, ma non genererà alcun avviso se non viene utilizzato, e il puntatore sarà rivolta da la 'e' (posizione 1) anche.

Queste tre forme fa lo stesso dal punto di vista puntatore indirizzo ..

IMHO Questa è la cosa peggiore di alcuni linguaggi di programmazione (quasi tutti) ..

"C'è una scarsa distanza di Hamming tra un codice e qualsiasi bug"

Non abbiamo alcuna ridondanza, quando la programmazione, se si prende un libro di legge, e scrivere caratteri casuali all'interno, Sarà leggibile, ma se si digita casuale quando la programmazione, si ottiene un bug, 100% di precisione

È stato utile?

Soluzione

++ ha la precedenza su *. Ma sono d'accordo, non è chiaro quando si mescolano entrambi nella stessa istruzione.

Altri suggerimenti

Secondo la precedenza operatore in C, ++ valuterà prima, e solo allora *. Quindi, in *p++, ptr otterrà il suo valore inceremented, e quindi la dichiarazione otterrà il valore del opbject a cui ptr è ora punta a. Naturalmente, questo non è diverso da ptr++, dal momento che non si utilizza il valore della dichiarazione.

Chiunque miscele ++, -., + = Ecc con altri operatori ha già fallito la scrittura di codice leggibile, il fatto che faranno bug fuori non è altro che la loro causa

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top