Partage
  • Partager sur Facebook
  • Partager sur Twitter

" ou '

Sujet résolu
    30 janvier 2019 à 19:27:06

    Bonjour. Je vous écris car je me pose une question. " c'est pour les chaines de caractères de plusieurs caractères et ' c'est pour qu'un caractère c'est ça ? Merci d'avance.
    • Partager sur Facebook
    • Partager sur Twitter
      30 janvier 2019 à 19:55:56

      Attention, ce sont 2 types complètement différents et pas forcement compatible.

      - " = chaines de caractères, qui peut avoir 0, 1 ou plusieurs caractères.

      - ' = le type caractère (char), qui doit contenir 1 et 1 seul caractere.

      Ces types ne sont pas compatibles et mal les utiliser peut produire des erreurs de compilation, des warnings, des comportement indeterminés (undefined behavior)

      constexpr char c1 { 'a' };
      std::cout << c1 << std::endl;

      affiche :

      a
      constexpr char c2 { 'abcd' };
      std::cout << c2 << std::endl;

      affiche :

      prog.cc:5:21: warning: multi-character character constant [-Wfour-char-constants]
      constexpr char c2 { 'abcd' };
                          ^
      prog.cc:5:21: error: constant expression evaluates to 1633837924 which cannot be narrowed to type 'char' [-Wc++11-narrowing]
      constexpr char c2 { 'abcd' };
                          ^~~~~~
      prog.cc:5:21: note: insert an explicit cast to silence this issue
      constexpr char c2 { 'abcd' };
                          ^~~~~~
                          static_cast<char>( )
      prog.cc:5:21: warning: implicit conversion from 'int' to 'const char' changes value from 1633837924 to 100 [-Wconstant-conversion]
      constexpr char c2 { 'abcd' };
                        ~ ^~~~~~
      2 warnings and 1 error generated.
      constexpr char c3 { "a" };
      std::cout << c3 << std::endl;

      affiche :

      prog.cc:5:21: error: cannot initialize a variable of type 'const char' with an lvalue of type 'const char [2]'
      constexpr char c3 { "a" };
                          ^~~
      1 error generated.
      constexpr char c4 { "abcd" };
      std::cout << c4 << std::endl;

      affiche :

      prog.cc:5:21: error: cannot initialize a variable of type 'const char' with an lvalue of type 'const char [5]'
      constexpr char c4 { "abcd" };
                          ^~~~~~
      1 error generated.
      const std::string s1 { 'a' };
      std::cout << s1 << std::endl;

      affiche :

      a
      const std::string s2 { 'abcd' };
      std::cout << s2 << std::endl;

      affiche :

      prog.cc:5:24: warning: multi-character character constant [-Wfour-char-constants]
      const std::string s2 { 'abcd' };
                             ^
      prog.cc:5:24: error: constant expression evaluates to 1633837924 which cannot be narrowed to type 'char' [-Wc++11-narrowing]
      const std::string s2 { 'abcd' };
                             ^~~~~~
      prog.cc:5:24: note: insert an explicit cast to silence this issue
      const std::string s2 { 'abcd' };
                             ^~~~~~
                             static_cast<char>( )
      prog.cc:5:24: warning: implicit conversion from 'int' to 'const char' changes value from 1633837924 to 100 [-Wconstant-conversion]
      const std::string s2 { 'abcd' };
                           ~ ^~~~~~
      2 warnings and 1 error generated.
      const std::string s3 { "a" };
      std::cout << s3 << std::endl;

      affiche :

      a

      et

      const std::string s4 { "abcd" };
      std::cout << s4 << std::endl;
      

      affiche :

      abcd

      Au final, les syntaxes valides sont :

      constexpr char c1 { 'a' };
      const std::string s1 { 'a' };
      const std::string s3 { "a" };
      const std::string s4 { "abcd" };

      -
      Edité par gbdivers 30 janvier 2019 à 19:57:13

      • Partager sur Facebook
      • Partager sur Twitter
        8 février 2019 à 11:09:24

        J'ai lu le début mais j'ai arrêté j'ai un peu de mal à comprendre les messages d'erreur et certains mots du programme comme constexpr. Mais en tout cas j'ai compris ce que tu m'as dit au début. Merci beaucoup de ta réponse. À bientôt dans un autre sujet.
        • Partager sur Facebook
        • Partager sur Twitter
          8 février 2019 à 16:48:58

          Et attention aussi au fait que UTF-8 peut générer plusieurs octets (char) pour un seul caractère.

          Exemple : u8"é". C'est un caractère, mais la chaîne de caractères fait 2 octets. Car é en UTF-8 est représenté via deux octets.

          Donc toujours prendre .size() / strlen et autres fonctions avec des pincettes.

          • Partager sur Facebook
          • Partager sur Twitter

          git is great because Linus did it, mercurial is better because he didn't.

            8 février 2019 à 20:25:15

            En fait char, c'est pas caractère, mais octet.

            La confusion vient du bon vieux temps où personne n'avait l'idée saugrenue d'utiliser de caractères accentués, code ASCII 7 bits, et où le 8 ième bit d'un octet servait au contrôle de parité ou à ajouter un bit d'information. 

            L'âge d'or a continué un peu avec les codes ISO-LATIN et compagnie qui codaient un caractère sur 8 bits.

            Maintenant on est souvent dans le cas de chaines de caractères unicode, avec un codage UTF-8 "multibyte" qui fait qu'un caractère peut être codé par plusieurs octets.  Ce qui fait que  strlen("été") ne vaut pas 3 et que son premier octet n'est pas égal au dernier. Ce qui fout en l'air une série d'exercices classiques, genre tester si une chaine de caractères est un palindrome. Et fusille les colonnes de texte joliment alignées autrefois à coup de  printf("%-20s%-20s", nom, prenom).

            • Partager sur Facebook
            • Partager sur Twitter

            " ou '

            × 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