Faites attention sur la priorité de * et ++ en C / C ++, (et toute combinaison de touches lorsque la programmation) [fermé]
-
29-09-2019 - |
Question
Quelqu'un écrire cette fonction
void strToUpper(char *p) {
while (*p) {
*p = TOUPPER(*p);
*p++; //<-- Line to pay attention
}
}
J'ai demandé, pourquoi ne vous mettez le * avant p ++?
réponse: parce que «C'est la même », je corrige le code, puis rester en colère pendant un certain temps, parce que les deux fonctionnent vraiment la même ...
void strToUpper(char *p) {
while (*p) {
*p = TOUPPER(*p);
p++; //<-- Line to pay attention
}
}
Je voudrais partager avec stackoverflow, par exemple:
char s [6] = "bonjour";
Que faudrait-il faire?
*++ptr;
Il évaluera les ++ pré-incrément (sur le pointeur) et l'opérateur de déréférencement *, il laissera une valeur de caractère « e » (deuxième lettre de « bonjour ») (qui n'est pas utilisé dans ce cas et pourrait générer un avertissement sur la compilation) et le pointeur sera pointé du (position 1) « e »
Que faudrait-il faire?
*ptr++;
Ceci est un peu bizarre car il évaluera l'opérateur de déréférencement * Tout d'abord, il laissera une valeur de char « h » (qui est utilisé ni dans ce cas), puis le post-incrément ++ (au pointeur ), de sorte que (encore) le pointeur est pointé à partir de la (position 1) 'e'
Que faudrait-il faire?
ptr++;
Enfin, il ne sera pas un Lvalue de char, mais il ne génère aucun avertissement si n'est pas utilisé, et le pointeur pointera du « e » (position 1) aussi.
Ces trois formes fait la même chose à l'adresse du pointeur point de vue ..
Ce à mon humble avis est la pire chose que de certains langages informatiques (presque tout le monde) ..
"Il y a une distance mauvaise Hamming entre un code et tout bug"
Nous avons pas de redondance lorsque la programmation, si vous prenez un livre de la Loi, et d'écrire les caractères aléatoires à l'intérieur, il sera lisible, mais si vous tapez au hasard lorsque la programmation, vous obtenez un bug, 100% de précision
La solution
++ a priorité sur *. Mais je suis d'accord, on ne sait pas quand vous mélanger les deux dans la même déclaration.
Autres conseils
Selon la priorité de l'opérateur en C, ++
évaluera d'abord, et seulement alors *
. Ainsi, dans *p++
, ptr
obtiendra sa valeur inceremented, puis la déclaration aura la valeur de la opbject à laquelle ptr
pointe maintenant. Bien sûr, cela ne diffère pas de ptr++
, puisque vous n'utilisez pas la valeur de l'instruction.
Toute personne qui mixes ++, -, + = etc avec d'autres opérateurs a déjà écrit pas un code lisible, le fait
qu'ils vont sortir bug est rien de plus que leur dû.