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

JavaScript Discussion :

Comment lire Conditions if


Sujet :

JavaScript

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2019
    Messages : 29
    Par défaut Comment lire Conditions if
    Bonjour !

    Je reviens avec une question simple(je crois), j'ai un exercice à réaliser et je ne comprends pas bien la logique avec laquelle on doit lire les conditions if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    "use strict"
    let a = -1;
    let b = 0;
     
    if (a) {
      b++;
    }
     
    if (a && a++) {
      b++;
    }
    if (a || a++) {
      b++;
    }
    if (!a && a++) {
      b++;
    }
    if (!a || a++) {
       b++;
    }
    console.log(a, b);
    Le résultat en console est
    a= 2 / b = 3
    Mais je ne comprends pas du tout comment on est arriver à là ni comment je dois lire cela.
    Concrètement pour le premier if par exemple : si a(-1) est bien -1 alors b(0) gagne +1? à ce niveau la console indique bien a=-1 et b=1
    Mais après je ne suis plus : si a(-1) et a++(-1+1=0) , comment lit-on cela? car a est à la fois -1 et 0, pourtant à la fin la console indique que a=0 ; Aussi je ne comprends pas bien la condition ici, si a est vrai? vrai par rapport à quoi ?
    Désolé si je n'exprime pas très bien la question.

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    1- mets des console.log() dans chaque if :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    "use strict"
    let a = -1;
    let b = 0;
     
    if (a) {
      b++;
      console.log('1)', a, b);
    }
     
    if (a && a++) {
      b++;
      console.log('2)', a, b);
    }
    if (a || a++) {
      b++;
      console.log('3)', a, b);
    }
    if (!a && a++) {
      b++;
      console.log('4)', a, b);
    }
    if (!a || a++) {
      b++;
      console.log('5)', a, b);
    }
    console.log(a, b);
    On obtient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    1) -1 1
    2) 0 2
    5) 2 3
    2 3
    Donc :
    • les conditions 1) 2) 5) sont vraies (true)
    • les conditions 3) 4) sont fausses (false)



    2- A part le 1er if, on a à chaque fois 2 conditions à remplir.
    Chaque condition sera true ou false.


    Si la valeur est omise ou est 0, -0, null, false, NaN, undefined ou une chaine de caractères vide (""), l'objet a un valeur initiale à false (faux).
    [...]
    Toutes les autres valeurs, y compris n'importe quel objet, un tableau vide ([]), ou une chaine de caractères "false", créént un objet avec une valeur initiale à true (vrai).
    Ensuite, c'est de la logique :
    • (true && true) -> true
    • (true && false) -> false
    • (false && true) -> false
    • (false && false) -> false

    • (true || true) -> true
    • (true || false) -> true
    • (false || true) -> true
    • (false || false) -> false

  3. #3
    Invité
    Invité(e)
    Par défaut
    1- autre "subtilité" :




    • Si l'opérateur est utilisé en suffixe (par exemple : x++), il renvoie la valeur avant l'incrémentation.
    • Si l'opérateur est utilisé en préfixe (par exemple : ++x), il renvoie la valeur après l'incrémentation.


    Par conséquent, le 2ème if :
    est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (-1 && -1) { et seulement APRES on incrémente a !

    2- d'autre part (pour le code que tu montres) :

    • que chaque condition (contenant a++) soit vrai ou fausse, a++ s'applique !
    • alors que le b++ ne s'applique QUE si la condition est vraie.
    Dernière modification par NoSmoking ; 09/07/2019 à 10h49.

  4. #4
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2019
    Messages : 29
    Par défaut
    Et a quel moment a passe de 0 à +2 ?
    Chaque évolution est normalement validé, et chaque fois a et/ou b gagne +1(0 puis 1,2 et 3 pour b ; -1 puis 0 pour a), comment passe t-il à +2 d'un coup ?

  5. #5
    Membre averti
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2019
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2019
    Messages : 29
    Par défaut
    jreaux62 Merci beaucoup pour votre réponse.

    Le conseil pour mettre console.log à chaque fois, je ne connaissais pas et je sens que ça va beaucoup m'aider ^^
    La subtilité du code concernant les ++, pareils ça m'aide grandement.
    J'avais déjà regarder à plusieurs reprise cette section sur MDN mais apparemment ma logique me fait défaut :
    Pourquoi est ce que dans la 3ème : if (a || a++) cela est considéré comme faux ? --> a et 0 à ce moment, et je ne comprends pas en quoi cette formule et moins Vrai que (a && a++) ??

  6. #6
    Invité
    Invité(e)
    Par défaut
    On à affaire à une AUTRE subtilité des conditions multiples :

    0- les conditions sont évaluées de gauche à droite, une condition après l'autre.

    1- avec || (OR) :
    • (true || ..... || ..... || ..... || .....) :

    -> dès qu'on rencontre une condition true (en partant de la condition la plus à gauche) :
    • ça revoie directement true,
    • et les conditions suivante ne sont pas évaluées !

    PAR CONTRE :
    2- avec && :
    • (false && ..... && ..... && ..... && .....) : le code est évalué de gauche à droite, une condition après l'autre.

    -> dès qu'on rencontre une condition false (en partant de la condition la plus à gauche) :
    • ça revoie directement false,
    • et les conditions suivante ne sont pas évaluées !


    3- C'est dans la 4ème condition que a++ n'est pas exécuté :
    • a vaut 1 (true) -> donc !a vaut false
    • or, false && (n'importe quoi d'autre) renverra forcément false
    • -> ça renvoie false dès cette 1ère condition
    • inutile d'évaluer a++ -> a reste à 1


    4- DONC, les valeurs successives de a sont :
    • a = -1 (valeur de départ)
    • 1) -1
    • 2) a++ -> 0
    • 3) a++ -> 1
    • 4) (a++ PAS exécuté) -> 1
    • 5) a++ -> 2

    On obtient a=2 au final.


    Je pense que mon raisonnement est bon...
    Mais il est aussi possible que je me trompe....
    Sur ce, je vais prendre une aspirine....
    Dernière modification par Invité ; 10/07/2019 à 10h13.

  7. #7
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    [...]

    Citation Envoyé par Lexlaflex Voir le message
    ...et je ne comprends pas en quoi cette formule et moins Vrai que (a && a++) ??
    Au moment de la condition if (a && a++) on a a qui vaut -1 et -1 cela n'est pas 0, sa "valeur logique" est true du coup a++ est exécutée mais l’exécution a lieu après l'évaluation de la condition, ce qui fait qu'au moment de l'évaluation de la condition on a a++ qui vaut -1 (et non 0) et donc la condition est : -1 && -1 (et non -1 && 0) et cette condition -1 && -1 est considérée comme vraie (true)...

    Après l'évaluation de la condition a passe à 0.

  8. #8
    Membre émérite
    Femme Profil pro
    Autre
    Inscrit en
    Janvier 2017
    Messages
    340
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Autre

    Informations forums :
    Inscription : Janvier 2017
    Messages : 340
    Par défaut
    Bonjour,
    Citation Envoyé par Beginner. Voir le message
    a++ est exécutée mais l’exécution a lieu après l'évaluation de la condition
    C'est comme si... mais je me demande si c'est l'ordre exact.

    Je verrais davantage ceci :
    1) l'expression a++ vaut a avant l'incrémentation,
    2) puis a est incrémentée,
    3) puis l'expression est utilisée (ici : évaluée en tant que booléen).

    Si on a plusieurs expressions, on voit que l'incrémentation a lieu avant l'évaluation complète en tant que booléen : si a=0, alors console.log(Boolean(a++ || (console.log(a),a))) affichera 1 et true.


    Dans le même genre, on lit souvent que si on écrit :
    alors b vaut 0 puis a est incrémentée, comme si on avait écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var a=0;
    var b=a;
    ++a;
    Mais cela correspond-il à l'ordre réel ?
    Cet exemple permet d'en douter :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var a=0;
    var b=(a++)+0;
    Pour moi, a vaut 1 avant l'addition et donc avant que b ne prenne sa valeur.
    En effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function zero(){console.log(a,b);return 0;}
    var a=0;
    var b=-1;
    b=(a++)+zero();
    On voit que b n'a pas encore changé de valeur et vaut donc encore -1 alors que a est déjà passé à 1.

    De même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var a=0;
    var b=(a++)+a; //b=1
    Par conséquent, il me paraît probable que même si on écrit juste b=a++, l'affectation est exécutée après l'incrémentation (ce qui ne veut évidemment pas dire que b prend la nouvelle valeur de a).


    Par rapport à l'exercice initial, il faut penser à afficher les conversions booléennes (cela a peut-être déjà été dit ?).
    Pour savoir comment les expressions vont être évaluées, il suffit de tester à part, exemple avec if (!a || a++) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    let a=1;
    console.log("!a",!a); //false
    console.log("a++",Boolean(a++)); //(ou console.log("a++",!!(a++)) ) true
    L'expression sera donc évaluée comme false || true.


    Dernière chose : je trouve préférable de faire des comparaisons claires comme if(a!==0) et non if(a).

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    * Il est aussi possible que je me trompe....
    Je n'ai pas voulu me faire une hernie au cerveau...
    Surtout un dimanche.

    [EDIT] J'ai corrigé mon précédent message.
    Dernière modification par Invité ; 09/07/2019 à 18h08.

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Octobre 2011
    Messages
    2 910
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 2 910
    Par défaut
    Ah bah cela se comprend...

Discussions similaires

  1. Comment lire un fichier DB en cours d'utilisation par 1 autr
    Par jbat dans le forum Bases de données
    Réponses: 4
    Dernier message: 12/03/2004, 11h06
  2. Comment lire un fichier image
    Par Charlemagne dans le forum DirectX
    Réponses: 9
    Dernier message: 12/03/2004, 00h22
  3. [Debutant] Comment lire la taille d'un fichier binaire ?
    Par Invité dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 18/12/2003, 19h20
  4. Réponses: 2
    Dernier message: 06/12/2002, 07h50
  5. Réponses: 5
    Dernier message: 20/08/2002, 18h01

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