Prendere a cuore la precedenza su * e ++ in C / C ++, (e qualsiasi tasto quando la programmazione) [chiusa]
-
29-09-2019 - |
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
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