Partage
  • Partager sur Facebook
  • Partager sur Twitter

une question sur le fonctionnement de IF

    17 août 2018 à 1:00:41

    Bonsoir,

    J'ai remarqué que dans quelque codes que j'ai vu qu'ils utilisent la sortie d'une une fonction dans "if" mais sans la faire appel avant le "if" (oui la fonction est définie). Ma question est 'comment le "if" fonctionne, comment il traite l'expression donnée (la condition), est ce qu'il l'exécute d'abord? et supposant la condition n'est pas vérifiée et ce que l'expression s'exécute quand même?

    Voici l'exemple que j'ai vu, (la fonction init() a une sortie de type bool):

    int main( int argc, char* args[] )
    {
        //Start up SDL and create window
        if( !init() )
        {
            printf( "Failed to initialize!\n" );
        }
        else
        {... }

    J'ai cru qu'il faillait appeler la fonction d'abord avant de tester sa sortie

    int main( int argc, char* args[] )
    {
        //Start up SDL and create window
     init();   
    if( !init() )
        {
            printf( "Failed to initialize!\n" );
        }
        else
        {...}



     
    Merci d'avance :)

    -
    Edité par MalikaOubilla 17 août 2018 à 1:02:05

    • Partager sur Facebook
    • Partager sur Twitter
      17 août 2018 à 1:43:05

      La condition d'un if est une expression booléen : true ou false.

      l'appel d'une fonction est remplacé par le résultat retourné, si la fonction "init" retourne un booléen, le résultat retourné est un booléen donc une expression booléenne.

      Dans votre 2ème code, vous faites las actions de la fonction "init" 2 fois, donc une pour rien (et foutez la merde si votre méthode et mal fichue avec des effets de bords, c'est jamais bon signe une fonction "init" dans du code C++.

      • Partager sur Facebook
      • Partager sur Twitter
      Je recherche un CDI/CDD/mission freelance comme Architecte Logiciel/ Expert Technique sur technologies Microsoft.
        17 août 2018 à 17:45:12

        Salut,

        Les deux codes ne sont pas du tout pareil, comme l'a indiqué bacelar.

        Et, pour être clair : le deuxième code que tu présente est très vraisemblablement faux, ne serait-ce que parce que la fonction init() ne doit sans doute être appelée qu'une seule fois (et que les appels suivants risquent de renvoyer false, du coup)

        L'équivalent du code

        int main( int argc, char* args[] )
        {
            //Start up SDL and create window
            if( !init() )
            {
                printf( "Failed to initialize!\n" );
            }
            else
            {... }
        }

        qui ne ferait appel qu'une seul fois à la fonction init récupérerait le résultat de la fonction (*) init dans une variable locale de la fonction main et utiliserait cette variable locale comme condition du if, sous une forme proche de

        int main( int argc, char* args[] )
        {
            bool sdlInitialized = init();
            if( !sdlInitialized )
            {
                printf( "Failed to initialize!\n" );
            }
            else
            {... }

        (*) note au passage que, dans l'idéal, il faut forcément faire quelque chose de la valeur renvoyée par toutes les fonction non void.

        On peut, comme dans le premier code, utiliser directement le résultat de l'appel à la fonction pour créer la condition d'un test, ou, comme dans mon code d'exemple utiliser une variable qui puisse représenter le résultat de la fonction à laquelle on fait appel.  Mais, quoi qu'il en soit, si une fonction renvoie "quelque chose",

        NOTA: le mot clé if() a la particularité de réduire l'expression mise entre parenthèse à un résultat qui ne peut valoir que true ou false (ce que l'on appelle un booléen). Lorsque l'expression en question correspond à une valeur numérique (faisons simple : disons un int), le booléen correspondant est généré en suivant une règle simple : si la valeur numérique est égale à 0, nous obtenons false; pour toutes les autres valeurs, nous obtenons true.

        Par contre, le fait d'inverser (d'utiliser l'opérateur ! ) une valeur égale à true donnera forcément un résultat égal à false, et inversement, le fait d'inverser la valeur false donnera forcément un résultat égal à true.

        Si la fonction init dont il est question ici est issue d'une bibliothèque écrite en C, il est plus que vraisemblable qu'elle renvoie un int et non un bool.  Ce int sera sans doute égal à 0 si la fonction init() rencontre un problème et à "autre chose" si elle s'exécute correctement.

        Le code

        if(! init()){
        
        }

        aura donc comme résultat

        • de transformer le 0 en false
        • de transformer ce false en "true"

        si la fonction rencontre un problème, ce qui nous fera passer dans la branche "vraie" du test, et comme résultat

        • de transformer "n'importe quelle autre valeur" en true
        • de transformer ce true en false

        si la fonction init ne rencontre pas de problème, ce qui nous fera passer dans la branche "else" du test.

        • Partager sur Facebook
        • Partager sur Twitter
        Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire viennent aisément.Mon nouveau livre : Coder efficacement - Bonnes pratiques et erreurs  à éviter (en C++)Avant de faire ce que tu ne pourras défaire, penses à tout ce que tu ne pourras plus faire une fois que tu l'auras fait
          21 août 2018 à 4:11:17

          @Koala01 En fait, en bon programmeur C je vais plutôt renvoyer 0 si tout s'est bien passé, et une autre valeur s'il y a eu un problème, l'autre valeur étant bien entendu un code d'erreur permettant d'identifier la nature du problème ^^ (c'est pour ça qu'en C, on renvoie presque toujours un int dans ce genre de cas, et que la valeur 0 correspond la plupart du temps à "NO_ERROR" ou "ERROR_SUCCESS")

          -
          Edité par int21h 21 août 2018 à 4:21:32

          • Partager sur Facebook
          • Partager sur Twitter
          Mettre à jour le MinGW Gcc sur Code::Blocks. Du code qui n'existe pas ne contient pas de bug

          une question sur le fonctionnement de IF

          × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
          × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
          • Editeur
          • Markdown