我正在复习我的第一学期C++课,我想我错过了一些东西。一个字符串占用多少字节?炭?
我们得到的例子是,有些是字符文字,有些是字符串:
'n', "n", 'n', "n", "\n", ""
我对那里换行符的使用特别困惑。
#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; // 2
std::cout << sizeof "\n" << std::endl; // 3
std::cout << sizeof "" << std::endl; // 1
}
- 单引号表示字符。
- 双引号表示带有不可见
NUL
的 C 样式字符串终结者。
n
(换行符(只是一个字符,\
(反斜杠(也是如此。 \n
只是一个反斜杠,后跟n
。
-
'n'
:不是字符串,是一个文字字符,一个字节,字母 n 的字符代码。 -
"n"
:字符串,两个字节,一个用于 n,一个用于每个字符串末尾的空字符。 -
"n"
:两个字节作为 代表"换行符",它需要一个字节,加上一个字节作为空字符。 -
'n'
:与第一个相同,文字字符,不是字符串,一个字节。 -
"\n"
:三个字节..一个用于\,一个用于换行符,一个用于空字符 -
""
:一个字节,只是空字符。
- 根据定义,
char
占用一个字节。
使用 - 字符文本;使用
"
的文本是字符串文本。 - 字符串文本隐式以 null 结尾,因此它将比文本中可观察的字符数多占用一个字节。
-
是转义字符,
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
编辑:格式固定
edit2:我写了一些非常愚蠢的东西,感谢Mooing Duck指出这一点。
字符串占用的字节数等于字符串中的字符数加上 1(终止符(,乘以每个字符的字节数。每个字符的字节数可能会有所不同。常规char
类型为 1 个字节。
所有示例的长度均为一个字符,但倒数第二个示例为两个字符,最后一个示例为零。(有些类型为 char
,仅定义单个字符。
'n'
-> 一个char
. char
始终为 1 个字节。 这不是字符串。
"n"
-> 字符串文本,包含一个n
和一个终止 NULL char
。 所以 2 个字节。
'n'
-> 一个char
,一个char
总是1个字节。 这不是字符串。
"n"
-> 字符串文本,包含一个n
和一个终止 NULL char
。 所以 2 个字节。
"\n"
-> 字符串文本,包含一个、一个 '' 和一个终止 NULL
char
。 所以 3 字节。
""
-> 字符串文本,包含一个终止 NULL char
。 所以 1 个字节。
您似乎指的是字符串常量。 并将它们与字符常量区分开来。
在所有体系结构上,char
都是一个字节。 字符常量使用单引号分隔符'
。
字符串是具有尾随 NUL 字符的连续字符序列,用于标识字符串的末尾。 字符串使用双引号字符 '"'。
此外,您还介绍了 C 字符串常量表达式语法,该语法使用黑斜杠来指示特殊字符。 n
是字符串常量中的一个字符。
因此,对于示例'n', "n", 'n', "n"
:
'n'
是一个字符
"n"
是一个带有一个字符的字符串,但它需要两个存储字符(一个用于字母 n
,一个用于 NUL
'n'
是一个字符,换行符(在基于 ASCII 的系统上为 ctrl-J(
"n"
是一个字符加一个 NUL。
我让其他人根据这些来解谜。
'n' - 0x6e
"n" - 0x6e00
'n' - 0x0a
"n" - 0x0a00
"\n" - 0x5c6e00
"" - 0x00
取决于是否使用 UTF8 字符是 1 字节,如果 UTF16 字符是 2 字节,则字节是 00000001 或 10000000 无关紧要,一旦声明初始化,就会为字符注册并保留一个完整的字节,如果字符更改,则此寄存器将使用新值更新。
字符串字节数等于 " 之间的字符数。
示例:11111111是填充字节,UTF8 字符 T = 01010100(1 字节(
UTF16 字符 T = 01010100 00000000(2 字节(
UTF8 字符串"编码"= 011000110110111101100100011010010110111001100111(6 字节(
UTF16 字符串"编码"= 011000110000000001101111000000000110010000000000011010010000000001101110000000000110011100000000(12 字节(
UTF8 = 0101110001101110(2 字节(
UTF16 = 01011100000000000110111000000000(4 字节(
注意:您键入的每个空格和每个字符在编译器中占用 1-2 个字节,但空间太大,除非您为 90 年代初的计算机或游戏机键入 4MB 或更小的代码,否则您不必担心字符串或字符方面的字节。
对内存有问题的事情是调用需要大量计算的东西,包括浮点数、小数或双精度数,并在循环或更新方法中使用数学随机。最好在运行时运行一次或在固定时间更新上运行一次,并在时间跨度内取平均值。