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 :

boucle avec différents types ?


Sujet :

avec Java

  1. #1
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut boucle avec différents types ?
    Bonjour,

    Je pensais que l'on ne pouvait pas mélanger les types de data dans une boucle for, or ceci fonctionne très bien et je me demande pourquoi :
    J'intègre un long et un int dans la boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int x = 0; 
    		long y = 5;
    		for(y = 0, x = 0; x < 5 && y < 10; x++, y++) {  
    			System.out.print(x + " "); }
    La boucle est un peu idiote mais c'est pour l'exemple
    Merci

  2. #2
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par olivier252 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    int x = 0; 
            long y = 5;
            for(y = 0, x = 0; x < 5 && y < 10; x++, y++) {
    Bonjour,

    Les deux variables x et y sont de types différents, soit. Les deux variables sont indépendantes dans la boucle :
    • elles sont initialisées indépendamment, quoique simultanément,
    • elles sont comparées chacune à une valeur littérale,
    • leurs valeurs sont modifiées par incrémentation.


    Donc, ça ne pose aucun problème de compilation.

    Si il y avait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while ((y < 10) && (flag == true))
    il y aurait une comparaison entre une valeur numérique (int ou long, peu importe) et un booléen, sans aucun problème.

    Par contre, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int x = 0; 
    long y = 5;
    for(y = 0, x = 0; x < 5 && y < x; x++, y++) {
    le code serait transcrit comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int x = 0; 
    long y = 5;
    for(y = 0, x = 0; x < 5 && y < (long)x; x++, y++) {
    .
    En effet, si deux valeurs numériques sont associées par affectation (int x = y, y étant long, ou l'inverse) ou comparaison, etc, elles sont transtypées dans le type contenant les plus grandes valeurs, et ici long est plus grand que int.
    cf https://jmdoudoux.developpez.com/cou...php#syntaxe-10

  3. #3
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Merci de ta réponse,

    Quand tu dis :
    Les deux variables x et y sont de types différents, soit. Les deux variables sont indépendantes dans la boucle :

    elles sont initialisées indépendamment, quoique simultanément,
    elles sont comparées chacune à une valeur littérale,
    leurs valeurs sont modifiées par incrémentation.



    Donc, ça ne pose aucun problème de compilation.
    Je ne saisis pas en quoi cela ne pose pas de soucis : ça veut dire quoi concrètement ? Que x (dans l'exemple) subit une conversion implicite en long selon le principe de promotion ?
    Mais du coup, ça veut dire que l'on compare des long à des littéraux(int) dans la boucle ?

    Désolé de pinailler, mais finalement ce que je croyais clair est assez confus

    Du coup je reviens car je pense avoir trouvé :
    Java considère l'initialisation dans la boucle comme l'on fait pour des variables d'instance à la volée comme par ex :
    Sauf que ici ça se passe tout bêtement dans la boucle donc x et y sont de type long. C'est cela qui m'a dérouté !

  4. #4
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par olivier252 Voir le message
    Sauf que ici ça se passe tout bêtement dans la boucle donc x et y sont de type long. C'est cela qui m'a dérouté !
    Ben non. Dans ce cas x n'a rien à voir avec y, et donc on n'a pas à modifier son type.

    Dans le code que tu proposes en premier exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    int x = 0; long y = 5;
    for(y = 0, x = 0; x < 5 && y < 10; x++, y++) {      System.out.print(x + " "); }
    x et y sont indépendants, car initialisés séparément, incrémentés séparément, et en l'occurrence ne sont pas comparés l'un à l'autre.
    On a bien (x < 5) d'un côté, (y < 10) de l'autre.

    Ils existent dans la même portée (le bloc de code comportant l'ensemble du code montré). La boucle fait partie de cette portée. Mais il n y a pas besoin de transtypage. En fait, dans ton exemple, on aurait pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int x = 0;
    long y = 0;
    boolean b = true;
    while (b) {
      ...
      x++;
      y++;
      boolean b1 = (x < 5);
      boolean b2 = (y < 10);
      b = b1 && b2;
    }

    Combien de fois est-on amené à faire des comparaisons complexes comportant des variables de différents types !

    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
      int x = getNbDonnees();
      String c = getCode();
      if ("".equals(c) && (x > 0)) {...}
     
      int n = getIndex();
      long elevation = getElevation();
     
      if ((n > 0) && (elevation >= ELEVATION_MIN) && (elevation <= ELEVATION_MAX))  {...}
    Là, aucun transtypage n'est nécessaire. Et entre int et String (chaîne de caractères), c'est impossible.


    Et parfois il est nécessaire de transtyper, mais il y a des contraintes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
      int x = 1;
      long y = 643101648;
     
    (1)  x = y + x;
    (2)  y = y + x;
    (1) devrait être refusé. un int ne peut contenir une donnée de type long.
    Il faudrait (si on est sûr des valeurs réelles possibles) convertir explicitement en écrivant :
    (2) est converti automatiquement en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (2)  y = y + (long)x;
    car un int peut être converti en long, plus grand, sans perte d'information.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    merci Cincinnatus

    D'accord, je comprends que les 2 valeurs numériques sont converties implicitement en cas d'affectation ou de comparaison. Or ce n'est pas le cas dans mon exemple comme tu me l'as expliqué : x et y sont indépendants, car initialisés séparément, incrémentés séparément, et en l'occurrence ne sont pas comparés l'un à l'autre.

    In fine, il n'y a pas de problème à la compilation. Donc est-ce qu'il faut comprendre que l'on peut déclarer des types différents dans le bloc d'initialisation de la boucle comme dans l'exemple (int x et long y) à condition que les conditions ci-dessus soient respectées ?

    C'est ça que je n'arrive pas à saisir.

  6. #6
    Membre émérite Avatar de Cincinnatus
    Homme Profil pro
    Développeur d'applications métier
    Inscrit en
    Mars 2007
    Messages
    593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur d'applications métier
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 593
    Par défaut
    Citation Envoyé par olivier252 Voir le message
    Donc est-ce qu'il faut comprendre que l'on peut déclarer des types différents dans le bloc d'initialisation de la boucle comme dans l'exemple (int x et long y) à condition que les conditions ci-dessus soient respectées ?
    Oui, effectivement.

    Comme le dit @jmdoudoux [1] 3.8.1 les boucles :
    Dans la boucle for ( initialisation; condition; modification)
    "Dans l'initialisation, on peut déclarer une variable qui servira d'index et qui sera dans ce cas locale à la boucle.
    Il est possible d'inclure plusieurs traitements dans l'initialisation et la modification de la boucle : chacun des traitements doit être séparé par une virgule."

    [1] https://jmdoudoux.developpez.com/cou...ap-syntaxe.php

    Ce cours est une référence très accessible et on y trouve de quoi apprendre à différents niveaux de connaissances. J'y retourne parfois pour certains points, après des années de Java .

    Bonne continuation,

  7. #7
    Membre éprouvé
    Homme Profil pro
    Reconversion
    Inscrit en
    Novembre 2018
    Messages
    503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Reconversion
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2018
    Messages : 503
    Par défaut
    Merci beaucoup pour ta patience. Cette fois c'est compris.
    C'est vrai que le cours de JMDoudoux est incroyable de part la qualité et la taille (plus de 3500 pages !). Le mettre à disposition pour tous est une grande marque de générosité.

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

Discussions similaires

  1. Alias avec différents types de quote ?
    Par Djobird dans le forum Administration système
    Réponses: 2
    Dernier message: 14/02/2011, 17h37
  2. [XL-2003] Graphique avec différents types de valeurs
    Par Sibuxian dans le forum Excel
    Réponses: 6
    Dernier message: 14/10/2010, 10h53
  3. automatisation formulaire avec différents types
    Par fhano dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 06/09/2008, 21h42
  4. [Forum] Forum avec différent type de structures
    Par t-die dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 2
    Dernier message: 13/11/2006, 09h19
  5. [Ireport] Condition avec différents types
    Par louveteau02 dans le forum iReport
    Réponses: 1
    Dernier message: 12/07/2006, 10h32

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