IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Notion de cast


Sujet :

avec Java

  1. #1
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut Notion de cast
    Bonjour,

    Je suis débutant en JAVA, et on nous à demander de tester des bouts de codes chez nous.

    Le code à tester est le suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public class test
    {
     
       public static void main(String[] args)
       {
      char c = 'a';
      c = c +  'a';
      System.out.print(c);
      }
     }
    Mais ca ne compile pas l'erreur est la suivante :

    test.java:7: possible loss of precision
    found : int
    required: char
    c = c + 'a';
    ^
    1 error

    Alors j'ai fait d'autres tests et j'ai trouvé deux autres codes qui marchent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public class test
    {
     
       public static void main(String[] args)
       {
      char c = 'a';
      c += 'a';
      System.out.print(c);
      }
     }
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
     
    public class test
    {
     
       public static void main(String[] args)
       {
      char c = 'a';
      c = (char) (c +'a');
      System.out.print(c);
      }
     }
    Et finalement ma question c'est que je ne comprends pas l'erreur du premier code. Pourquoi est-ce qu'il me dit que il trouve un integer alors que j'ai déclaré la variable "c" en char 1 ligne plus haut ? Et que la lettre a est entre simple quotte ce qui doit faire d'elle un type "char".

    Merci de vos futurs réponses,

    Bye bye

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut, (Re)

    La conversion (implicite), entre char et int, n'est possible que de char vers int, soit int = char

    exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    char c = 'a';  // 'a' n'est pas un type char mais la valeur décimale de la lettre a, c'est identique à c = 97;
    int i = 0;
     
    //c = i; // est refusé par javac (possible loss of precision)
    // par contre:
    i = c; // est ok (char vers int)
    que fait-on quand on écri c = c + 'a':
    c'est équivalent à c = c + 97, on veut donc ajouter 97 (int) à c, et donc c'est refusé (int vers char).

    Quand on fait c+= 'a', c'est faire c = 'a' + 'a', soit c = 97 + 97 donc c = 194, ce qui est correct.
    Penser que la table ASCII s'arrête à 255

    Voir ce lien:

    http://www.table-ascii.com/

    Cordialement,

    Dan

  3. #3
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Je viens de comprendre grâce à ton explication

    Merci beaucoup

    tchao

  4. #4
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    La conversion implicite de int vers char est impossible mais il reste possible de convertir un int en char en faisant un cast (conversion de type) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int nb = 97;
    char lettre = (char) nb; /* Le carractère sera 'a' */
    Ou si tu veut récupérer un nombre en tant que caractère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int nb = 1;
    /* on passe par une conversion en String */
    String str = Integer.toString (nb);
    char c = str.charAt (0); /* Le caractère sera 1 */

  5. #5
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Interessant merci de m'avoir répondu aussi.

    J'ai mit [résolu] mais si vous passez par là, j'ai encore quelques petites questions :
    En fait, 'a' ou encore 97 est considéré par défaut comme un int même si 'a' est entre quotte, c'est bien ça ?
    -------------------------------------
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    c = c + (char)('a');
    Pourquoi est-ce qu'il ne suffit pas de déclarer 'a' comme un char vu que c est déjà déclaré.

    ---------------------------------------
    Et finalement :
    Pourquoi est-ce qu'il ne me met pas d'erreur à la compilation, 2 n'est-il pas considéré comme un int ??

    Voila merci à vous si vous prenez le temps de me répondre =)

  6. #6
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Je pense que 97 en tant qu'expression est int, 'a' en tant qu'expression est char.

  7. #7
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Désolé j'avais fait des fautes en tapant, j'ai mit en gras mes changements =)

  8. #8
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par Trademark Voir le message
    Et finalement :
    Pourquoi est-ce qu'il ne me met pas d'erreur à la compilation, 2 n'est-il pas considéré comme un int ??
    Effectivement, ça fonctionne ...

    C'est donc qu'il y a conversion implicite avec les expressions uniquement et non les variables de type int alors.

    Ceci ne fonctionnerait pas par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int i = 2;
    char c = 'a' + i;

  9. #9
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    Ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
             char c = 'a'; //  c = 97;
             c = 2 + 'a';  //  c = 99;
             c = 'a' + 2;  //  c = 99;
             c = 97 + 2; //  c = 99;
             c = 'a' + 'a'; // c = 194;
             c = 99;
    À droite du signe = nous n'avons que des valeurs litérales. Ce que nous faisons donc c'est l'initialisation d'une variable char.

    Par contre si nous avons
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            c = 'a';
            int i = 2;
            c = i + 'a';
    Java considère qu'on veut assigner la valeur d'un int (i) à un char (c = i)
    donc avec risque de perte d'informations, c'est refusé.

    Il faudrait faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
            c = 'a';
            c+= i + 'a';
    dont l'équivalent est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
             c = 97 + 97 + 2; // que des valeur litérales, c'est ok
    Tout ce que nous avons fait ou tenté de faire ci-dessus c'est assigner une valeur à un type char.

    Pour info:
    Les conversions IMPLICITES ne sont autorisées que dans ce sens (de la pécision la plus petite à la plus grande).

    [char] --> [int] --> [long] --> [float] --> [double]
    et [byte] --> [short] --> [int] --> [long] --> [float] --> [double]

    Cordialement,

    Dan

  10. #10
    Membre confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2008
    Messages
    328
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Mexique

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2008
    Messages : 328
    Points : 459
    Points
    459
    Par défaut
    Salut,

    @ok.Idriss
    "La conversion implicite de int vers char est impossible mais il reste possible de convertir un int en char en faisant un cast (conversion de type)"

    Bien évidemment, mais mon propos était de répondre à:

    "Mais ca ne compile pas l'erreur est la suivante :

    test.java:7: possible loss of precision
    found : int
    required: char
    c = c + 'a';
    ^
    1 error".

    Et tu as eu raison de signaler le cast possible (conversion EXPLICITE donc)

    Cordialement,

    Dan

  11. #11
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par danimo Voir le message
    Et tu as eu raison de signaler le cast possible (conversion EXPLICITE donc)
    Bah oui, je me disais que si l'on ne connaissait rien au sujet ... on pourrait croire que la conversion d'un int en char était impossible (même si tu as dit "implicite" il est possible que ce ne soit pas compris immédiatement donc j'ai préféré préciser sans te contredire) ...

    Cordialement .

  12. #12
    Membre expérimenté Avatar de Trademark
    Profil pro
    Inscrit en
    Février 2009
    Messages
    762
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 762
    Points : 1 396
    Points
    1 396
    Par défaut
    Vos réponses m'auront été d'une grande aide.

    Merci à vous deux d'avoir passé du temps à me répondre.


    A la prochaine

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme CAST
    Par cedric31 dans le forum SQL
    Réponses: 2
    Dernier message: 16/02/2004, 10h46
  2. CAST ou autre ?
    Par 74160 dans le forum Requêtes
    Réponses: 2
    Dernier message: 10/07/2003, 15h00
  3. CAST DATETIME ----> SMALLDATETIME
    Par Guizz dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 26/06/2003, 12h07
  4. traduction en delphi "reinterpreted cast"
    Par Chupakabra dans le forum Langage
    Réponses: 3
    Dernier message: 13/02/2003, 15h49
  5. Notion d'algorithme
    Par gtr dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 10/12/2002, 11h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo