51 votes

Java : Soustraire '0' d'un char pour obtenir un int... pourquoi cela fonctionne-t-il ?

Cela fonctionne bien :

int foo = bar.charAt(1) - '0';

Pourtant, ce n'est pas le cas - car bar.charAt(x) renvoie un caractère :

int foo = bar.charAt(1);

Il semble qu'en soustrayant '0' du caractère, on le transforme en un nombre entier.

Pourquoi, ou comment, la soustraction de la chaîne '0' (ou est-ce un caractère ?) convertit-elle un autre caractère en un nombre entier ?

36 votes

Ne faites pas l'erreur de penser que '0' == 0 . En réalité, '0' == 48 .

2 votes

cliquez sur Ah, maintenant ça prend tout son sens ! Si seulement tu avais mis ça comme réponse et m'avais indiqué cs.utk.edu/~pham/ascii_table.jpg

0 votes

Ce cast implicite ne retourne pas la représentation décimale du caractère, comme @MarkPeters l'a souligné, donc si par exemple bar.charAt(1) retourne 'A', dont la représentation décimale est 65, int foo sera 17, 'A' - '0' = 65 - 48 = 17 et non 65.

1voto

aksarben Points 102

Votre code peut compiler sans erreur et s'exécuter sans lever d'exception, mais la conversion entre chars et int est une mauvaise pratique. Premièrement, cela rend le code confus, ce qui entraîne des problèmes de maintenance par la suite. Ensuite, des "astuces" astucieuses peuvent empêcher les compilateurs d'optimiser le code octet. L'une des meilleures façons d'obtenir rapide consiste à écrire stupide (c'est-à-dire pas astucieux code).

0voto

Codemwnci Points 28817

Parce qu'en Java, si vous ne spécifiez pas d'indicateur de type avec un nombre, il suppose Integer. Ce que je veux dire par là, c'est que si vous voulez définir une valeur Long, elle devra être 0L.

Lorsqu'on effectue une opération numérique sur deux nombres différents, le résultat prend la plus grande valeur. Ainsi, un caractère (qui est une valeur numérique) moins un nombre entier, donne un nombre entier.

Vous constaterez que cela fonctionne aussi

long val = bar.charAt(1) - 0L;

0voto

Dmitri Points 4199

Votre deuxième coupe devrait fonctionner correctement :

int foo = bar.charAt(1);

A char comme un short o byte sera toujours converti en silence en int si nécessaire.

Cela compilera très bien : int i = 'c';

0voto

Je vais me faire l'écho de ce que @Mark Peters a dit ci-dessus au cas où les gens négligeraient son commentaire.

Comme je le cite : " Ne faites pas l'erreur de penser que '0' == 0. En réalité, '0' == 48. "

0voto

Purva Points 193

5 a la valeur int de 53

Si nous écrivons '5'-'0', cela donne 53-48, ou l'int 5.

Si nous écrivons char c = 'B'+32 ; alors c enregistre 'b'.

'b' = 98.

Veuillez vous référer au tableau ASCII https://en.cppreference.com/w/cpp/language/ascii

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X