Faites attention sur la priorité de * et ++ en C / C ++, (et toute combinaison de touches lorsque la programmation) [fermé]

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

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

Était-ce utile?

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û.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top