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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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,

+ 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