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

Langage C++ Discussion :

un petit exercice pour les vacances


Sujet :

Langage C++

  1. #1
    Expert éminent
    un petit exercice pour les vacances
    Salut,

    je suis tombé sur un truc bizarre. Du coup je vous propose un petit exercice amusant.
    Prenons le code suivant :
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <iostream>
    int main() 
    {
       int i = -1;
       unsigned int j = 1;
       if ( i < j ) 
          std::cout << " i is less than j";
       else
          std::cout << " i is greater than j";
       return 0;
    }

    Question: quel est l'output console ?
    Tester c'est douter, corriger c'est abdiquer.

  2. #2
    Rédacteur/Modérateur

    warning C4018: '<': signed/unsigned mismatch
    Ensuite, c'est indéfini et un UB compilo-specific imo.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Expert éminent
    Citation Envoyé par Bousk Voir le message
    warning C4018: '<': signed/unsigned mismatch
    Pas en /W2 (ok je pinaille)
    Tu as raison, alors je reformule ma question :
    Quel est l'output, sur les 2 compilateurs sur lesquels j'ai pu tester : GCC 4.9.2 et MSVC 2017 ?
    Tester c'est douter, corriger c'est abdiquer.

  4. #4
    Membre expert
    i est plus que j.

    Les règles de conversion sont parfaitement définies par la norme. Du moins, à la manière de C++ avec des pages et des pages de point à prendre en compte .

    https://en.cppreference.com/w/cpp/la...tor_arithmetic

    Otherwise, if the unsigned operand's conversion rank is greater or equal to the conversion rank of the signed operand, the signed operand is converted to the unsigned operand's type.
    Du coup, int(-1) est transformé en ~unsigned(0), qui est très grand.

  5. #5
    Membre éprouvé
    Pareil.
    L'équivalent en hexa serait
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    if (0xFFFFFFFF < 0x00000001) ...
    qui est évalué comme false.

  6. #6
    Membre éprouvé
    Puisque vous aimez les petits problèmes...
    Voici une fonction qui doit agir comme une fonction de comparison en C, renvoyer un entier négatif si l<r, un entier positif si l>r, et 0 si l==r.
    Le code est-t-il correct pour toute valeur l et r ?
    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    template<typename T>
    constexpr std::enable_if_t<
    	std::is_integral<T>::value && (sizeof(T) <= sizeof(intptr_t)),
    	intptr_t> compare_op(T l, T r) noexcept
    {
    	return intptr_t(std::make_signed_t<T>(l - r));
    }

###raw>template_hook.ano_emploi###