Partage

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

Vous êtes demandeur d'emploi ?
Sans diplôme post-bac ?

Devenez Développeur web junior

Je postule
Formation
en ligne
Financée
à 100%
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++.

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.

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

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é.
  • Editeur
  • Markdown