Welcome to Bukkit France

Inscrivez-vous maintenant pour profiter d'un accès total à tout le contenu offert par la meilleur communauté Bukkit française ! Une fois inscrit et connecté, vous pourrez contribuez à la communauté en postant vos propres sujets et questions ou en répondant à ceux existants. Vous pourrez aussi customiser votre profil, recevoir des points de réputations, communiquer avec les autres membres via le chat, et plus encore! 

  • Annonces

    • Pskyco

      Bukkit France passe sous Discord !   02/20/16

      Bukkit France est désormais passé sur Discord, au revoir donc notre vieux Teamspeak ! Téléchargez le client et venez nous rejoindre sur notre salon en suivant les instructions suivantes.
      M-à-j du 25/02/2017 : Désormais, seuls les comptes actifs sur le forum se verront donner l'accès au Discord, ce dernier n'est pas une plateforme d'aide de la même manière que le chat.
  • billets
    6
  • commentaires
    20
  • vues
    2539

Chapitre III : Les conditions

while(true);

591 vues

Une condition peut être soit vraie, soit fausse.
Par exemple, la condition 2 < 3 est vraie, mais la condition 5 < 2 sera fausse.

Attention : Pour vérifier si un nombre est égal à un autre, on utilise == et non pas =, qui est l'opérateur d'assignation (pour assigner une valeur à une variable) et non pas celui de comparaison.

Il existe la structure conditionnelle if en C++. Elle permet de vérifier une condition (= tester) et si elle est vraie, alors du code sera exécuté. Il est possible de la compléter avec else, qui exécute du code dans le cas où la condition est fausse, ou else if, qui permet de vérifier une autre condition dans le cas où la première est fausse.
Pour délimiter le code à exécuter si la condition est vraie, on utilise soit des accolades, soit rien si on veut n'exécuter qu'une seule instruction (cela ne compte pas autres conditions et boucles).

#include <iostream>

int main()
{
    int valeur = 2;
  
    if (valeur < 7)
    {
        std::cout << valeur << " est bel et bien inférieur à 7!" << std::endl;
    }
    else if (valeur == 7)
    {
        std::cout << "La valeur est égale à 7" << std::endl;
    }
    else
    {
        std::cout << valeur << " est inférieur à 7." << std::endl;
    }
  
    return 0;
}
#include <iostream>

int main()
{
    int valeur = 2;
  
    if (valeur < 7)
        std::cout << valeur << " est bel et bien inférieur à 7!" << std::endl;
    else if (valeur == 7)
        std::cout << "La valeur est égale à 7" << std::endl;
    else
        std::cout << valeur << " est inférieur à 7." << std::endl;
  
    return 0;
}

Attention, deux erreurs très courantes chez les débutants (et pas que) :

  • On ne rajoute jamais de point-virgule après une structure conditionnelle (et plus tard, pareil avec les boucles)!
#include <iostream>

int main()
{
    int valeur = 2;
  
    if (valeur > 7); // Surtout pas ça! Cela équivaut au code ci-dessous...
        std::cout << valeur << " est supérieur à 7!" << std::endl;

  
    return 0;
}
#include <iostream>

int main()
{
    int valeur = 2;
  
    if (valeur > 7)
    {
        // Mettre un point-virgule après une condition, ça équivaut à dire : si quelque chose, alors ne rien faire.
        // Ce n'est pas du tout ce qu'on veut! Le pire dans tout ça, c'est que le code en dessous va être toujours exécuté.
        // En effet, rien n'empêche de mettre du code dans une scope "sauvage".
    }

    {
        std::cout << valeur << " est supérieur à 7!" << std::endl;
    }

  
    return 0;
}
  • Quand on ne met pas de scope, on ne peut pas mettre deux instructions à la suite!
#include <iostream>

int main()
{
    int valeur = 2;
  
    if (valeur > 7)
        std::cout << valeur << " est supérieur à 7!" << std::endl; // Cela ne va être exécuté que lorsque la valeur est supérieure à 7...
        std::cout << "Cette valeur est vraiment supérieure à 7!" << std::endl; // Ce code va être exécuté peut importe quelle est la condition! Une faille majeure dans OSX était justement due à ce genre d'erreur. Faites attention!
  
    return 0;
}

Approfondir :

Si on utilise un quelconque nombre en tant que condition, la condition sera fausse si nombre == 0 et vraie sinon.
Pour vérifier si un tel nombre est non nul (non égal à zéro), nous avons complètement le droit de faire if (nombre) et c'est couramment fait. Par soucis de clarté, j'évite de faire if (!nombre) pour vérifie si le nombre est nul. Sachez que cela ne cause aucun problème cependant, mais je préfère garder mon code explicite au possible.

 

Les opérateurs logiques nous permettent de vérifier plusieurs conditions à la fois dans une seule boucle if.

En voici la liste :

  • || signifie OU. Par exemple, if (valeur < 3 || valeur > 8) permet de vérifier si la valeur est inférieure à 3 OU supérieure à 8.
  • && signifie ET. Par exemple, if (valeur1 == 7 && valeur2 == 3) permet de vérifier si valeur1 est égale à 7 ET si valeur2 est égale à 3.
  • ! signifie NON. Cet opérateur permet d'inverser la valeur d'un booléen (ou de rendre un nombre non égal à 0 égal à 0 (pas zéro => 0) ou un nombre égal à zéro égal à 1 (0 => 1).
    Le C++ ne fournit pas d'opérateur OU EXCLUSIF logique (qui serait ^^) mais !a != !b permet d'obtenir le même résultat, c'est-à-dire que la condition sera vraie seulement si a est vrai mais pas b.
    Vous pouvez englober cela dans une simple fonction :
    inline bool xor(const bool& a, const bool& b)
    {
    	return (!a) != (!b);
    }

    Au passage : inline informe au compilateur qu'on souhaite que la fonction soit directement intégrée au code. C'est bien pour du petit code ou du code exécuté peu de fois pour gagner en performances en éradiquant le temps perdu par l'exécution de la fonction, mais peut ralentir et grandement alourdir le code binaire résultant pour de larges fonctions ou des fonctions appelées à divers endroits du code. Ce n'est pas une garantie et cela n'arrive en général que lorsqu'on active les optimisations (-O3 par exemple).
    const bool& passe les deux variables par référence constante pour permettre au compilateur de pousser ses optimisations (ici ça ne servirait que si l'inline n'est pas possible).


On peut englober une condition de parenthèses pour obtenir une meilleure clarté du code ou pour palier la priorité des opérateurs, par exemple : if ((valeur1 < 3) && ((8 + valeur2) > 7)).


4 personnes aiment ça


6 Commentaires


Pas très malin de décrire les conditions alors que les opérateurs n'ont pas encore été présenté, il manque la structure switch aussi.

1 personne aime ça

Partager ce commentaire


Lien vers le commentaire
Partager sur d’autres sites
il y a 39 minutes, ObimwaKenobi a dit :

Pas très malin de décrire les conditions alors que les opérateurs n'ont pas encore été présenté, il manque la structure switch aussi.

Je préfère le choix de mettre les structures conditionnelles avant les opérateurs pour faire un peu moins à encaisser d'un coup.
Quant à switch, je pensais la rajouter un peu plus tard dans approfondir vu que if/else fait presque la même chose, juste question de lisibilité (et d'opti)

Partager ce commentaire


Lien vers le commentaire
Partager sur d’autres sites

T'as des livres ou ressources sympa pour apprendre le c++ moderne (14 et se préparer à 17)? Actuellement mon utilisation de C++ se résume à de l'algorithmie (donc j'utilise juste deux/trois lib proposés, le reste j'utilise les biblio du C vu les perfs ridicule de certaine introduite par le langage (coucou cout/cin)), quelque chose de plutôt strict et en anglais si possible. 

Modifié par ObimwaKenobi

Partager ce commentaire


Lien vers le commentaire
Partager sur d’autres sites
Il y a 3 heures, ObimwaKenobi a dit :

T'as des livres ou ressources sympa pour apprendre le c++ moderne (14 et se préparer à 17)? Actuellement mon utilisation de C++ se résume à de l'algorithmie (donc j'utilise juste deux/trois lib proposés, le reste j'utilise les biblio du C vu les perfs ridicule de certaine introduite par le langage (coucou cout/cin)), quelque chose de plutôt strict et en anglais si possible. 

J'en connais pas en particulier mais la référence sur cppreference a de bons tutoriels pour un peu tout

Partager ce commentaire


Lien vers le commentaire
Partager sur d’autres sites
à l’instant, while(true); a dit :

J'en connais pas en particulier mais la référence sur cppreference a de bons tutoriels pour un peu tout

J'ai déjà lu une bonne partie de la référence, ça fait son taf mais je trouve ça vraiment léger, je crois que je vais directement partir sur le livre de Stroustrup. 

1 personne aime ça

Partager ce commentaire


Lien vers le commentaire
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !


Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.


Connectez-vous maintenant