Сколько байтов занимает строка? В Чаре?

Я делаю обзор моего первого семестра класса C++, и я думаю, что я что-то пропустил. Сколько байтов занимает строка? В Чаре?

примеры мы были приведены, некоторые символьные литералы и некоторые строки:

'n', "n", 'n', "n", "n", ""

меня особенно смущает использование там новых строк.

8 ответов


#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
}

одинарные кавычки указывают символы, двойные кавычки указывают строки C-стиля с невидимым нулевым Терминатором.

\n (разрыв строки) - это только один символ, а также \ (обратная косая черта). \n - это просто слеш с п.


  • A char по определению, занимает один байт.
  • литералы с помощью ' являются литералами char; литералы, использующие " строковые литералы.
  • строковый литерал неявно завершается нулем, поэтому он займет на один байт больше, чем наблюдаемое количество символов в литерале.
  • \ является escape-персонажем и \n является символом новой строки.

поставить их вместе, и вы должны быть в состоянии понять это из.


следующее займет x последовательных символов в памяти:

'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: форматирование исправлено

edit2: я написал что-то очень глупое, спасибо Mooing Duck за указание на это.


  • 'n': Это не строка, это литеральный символ, один байт, код ascii для символа n.
  • "n": строка, два байта, один для n и один для нулевого символа каждая строка имеет в конце.
  • "\n": два байта как \n означают "новую строку", которая занимает один байт, плюс один байт для нулевого символа.
  • '\n': то же, что и первый, буквальный символ, а не строка, один байт.
  • "\n": три байта.. один для \, один для newline и нулевой символ
  • "": один байт, только нулевой символ.

'n' -> один char. А char всегда 1 байт. Это не струна.
"n" -> строковый литерал, содержащий один n и один завершающий NULL char. Так что 2 байта.
'\n' -> один char, A char всегда 1 байт. Это не струна.
"\n" -> строковый литерал, содержащий один \n и один завершающий NULL char. Так что 2 байта.
"\n" -> строковый литерал, содержащий один \, один '\n' и один завершающий NULL char. Так что 3 байта.
"" - > строковый литерал, содержащий один завершающий NULL char. Так что 1 байт.


число байтов, которое занимает строка, равно числу символов в строке плюс 1 (Терминатор), умноженному на число байтов на символ. Количество байтов на символ может меняться. Это 1 байт для обычного char тип.

все ваши примеры имеют один символ, за исключением второго до последнего, который равен двум, и последнего, который равен нулю. (Некоторые из них типа char и определить только один символ.)


вы, похоже, ссылаетесь на строковые константы. И отличать их от констант характера.

A char один байт на всех архитектурах. Символьная константа использует одинарный разделитель кавычек '.

строка-это непрерывная последовательность символов с конечным нулевым символом для идентификации конца строки. Строка использует символы двойной кавычки '"'.

кроме того, вы вводите синтаксис выражения константы строки C, который использует blackslashes для обозначения специальных символов. \n один символ в строковую константу.

Итак, для примеров 'n', "n", '\n', "\n":
'n' один символ
"n" - строка с одним символом, но для хранения требуется два символа (один для буквы n и один для NUL
'\n' - это один символ, новая строка (ctrl-J в системах на основе ASCII)
"\n" один символ плюс ноль.

я оставляю другие головоломки на основе те.


'n'   - 0x6e
"n"   - 0x6e00
'\n'  - 0x0a
"\n"  - 0x0a00
"\n" - 0x5c6e00
""    - 0x00