Je suis en train de passer en revue ma première session de cours C++ au premier semestre et je pense avoir oublié quelque chose. Combien d'octets une chaîne prend-elle? Un omble?
Les exemples qui nous ont été donnés sont, certains étant des littéraux de caractères et d'autres des chaînes:
'n', "n", '\n', "\n", "\\n", ""
Je suis particulièrement déconcerté par l'utilisation de nouvelles lignes dans ces applications.
#include <iostream>
int main()
{
std::cout << sizeof 'n' << std::endl; // 1
std::cout << sizeof "n" << std::endl; // 2
std::cout << sizeof '\n' << std::endl; // 1
std::cout << sizeof 'n' << std::endl; // 1
std::cout << sizeof "\n" << std::endl; // 2
std::cout << sizeof "\\n" << std::endl; // 3
std::cout << sizeof "n" << std::endl; // 2
}
Les guillemets simples indiquent les caractères, les guillemets doubles indiquent les chaînes de style C avec un terminateur NUL invisible.
\n
(saut de ligne) correspond à un seul caractère, de même que \\
(barre oblique inversée). \\n
est juste une barre oblique inverse suivie de n.
char
, par définition, occupe un octet.'
sont des littéraux de caractères; les littéraux utilisant "
sont des littéraux de chaîne.\
est le caractère d'échappement et \n
est un caractère de nouvelle ligne.Rassemblez-les et vous devriez pouvoir le comprendre.
Ce qui suit prendra x caractères consécutifs en mémoire:
'n' - 1 char (type char)
"n" - 2 chars (above plus zero character) (type const char[2])
'\n' - 1 char
"\n" - 2 chars
"\\n" - 3 chars ('\', 'n', and zero)
"" - 1 char
edit: mise en forme fixe
edit2: J'ai écrit quelque chose de très stupide, merci Mooing Duck pour l'avoir signalé.
'n'
: n'est pas une chaîne, est un caractère littéral, un octet, le code ascii du caractère n."n"
: chaîne, deux octets, un pour n et un pour le caractère nul à la fin de chaque chaîne."\n"
: deux octets,\n signifiant "nouvelle ligne", qui prend un octet, plus un octet pour le caractère nul.'\n'
: identique au premier caractère littéral, pas à une chaîne, mais à un octet."\\n"
: trois octets .. un pour \, un pour nouvelle ligne et le caractère nul""
: un octet, juste le caractère nul.Le nombre d'octets qu'une chaîne prend est égal au nombre de caractères de la chaîne plus 1 (le terminateur), multiplié par le nombre d'octets par caractère. Le nombre d'octets par caractère peut varier. Il s'agit d'un octet pour un type char
régulier.
Tous vos exemples ont un caractère, à l'exception de l'avant-dernier, qui est deux, et le dernier, qui est zéro. (Certains sont de type char
et ne définissent qu'un seul caractère.)
'n'
-> Une char
. Une char
est toujours 1 octet. Ce n'est pas une chaîne."n"
-> Un littéral de chaîne, contenant une n
et une terminaison NULL char
. Donc 2 octets.'\n'
-> Une char
, Une char
est toujours 1 octet. Ce n'est pas une chaîne."\n"
-> Un littéral de chaîne contenant un \n
et un NULL char
. Donc 2 octets."\\n"
-> Un littéral de chaîne contenant un \
, un '\ n' et un NULL char
. Donc 3 octets.""
-> Un littéral de chaîne, contenant une terminaison NULL char
. Donc, 1 octet.
'n' - 0x6e
"n" - 0x6e00
'\n' - 0x0a
"\n" - 0x0a00
"\\n" - 0x5c6e00
"" - 0x00
Vous semblez faire référence à des constantes de chaîne. Et en les distinguant des constantes de caractère.
Un char
est un octet sur toutes les architectures. Une constante de caractère utilise le délimiteur guillemets '
.
Une chaîne est une séquence contiguë de caractères avec un caractère NUL final pour identifier la fin de la chaîne. Une chaîne de caractères utilise des guillemets doubles "".
En outre, vous introduisez la syntaxe d'expression constante de chaîne C qui utilise des barres obliques pour indiquer les caractères spéciaux. \n
est un caractère dans une constante de chaîne.
Donc, pour les exemples 'n', "n", '\n', "\n"
:'n'
est un caractère"n"
est une chaîne avec un caractère, mais il faut deux caractères de stockage (un pour la lettre n
et un pour le NUL'\n'
est un caractère, la nouvelle ligne (ctrl-J sur les systèmes ASCII)"\n"
est un caractère plus un NUL.
Je laisse les autres se débrouiller avec.