我正在回顾我上过的第一个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
。
std::endl
改成 '\n'
,我会给你点赞(+1)。 - Robᵩ'\n'
已经包含在这个赋值语句中了,我不想没必要地让 Moshe 困惑。 - fredoverflowstd::endl
的一个合理原因。+1 - Robᵩ'n'
: 不是字符串,是一个字面意义的字符,一个字节,代表字母n的字符编码。"n"
: 字符串,两个字节,一个为n,另一个为每个字符串末尾的空字符。"\n"
: 两个字节,\n表示“新行”,需要一个字节,加上一个字节的空字符。'\n'
: 与第一个相同,字面意义的字符,不是字符串,一个字节。"\\n"
: 三个字节,一个为反斜杠,一个为换行符,一个为空字符。""
: 一个字节,就是空字符。std::string
?字符串字面量?),以便更清晰地理解。 - Lightness Races in Orbitchar
占用一个字节。'
的文本是字符文字;使用 "
的文本是字符串文字。\
是转义字符,\n
是换行符。将它们组合起来,你就应该能够理解了。
'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
编辑:格式修正
编辑2:我写了一些非常愚蠢的东西,感谢Mooing Duck指出。
const char *
,而是const char [2]
,即两个字节。 - Mooing Duck一个字符串所占用的字节数等于该字符串中字符的数量加1(终止符),再乘以每个字符所占用的字节数。每个字符所占用的字节数可能不同。对于普通的char
类型,它占用1个字节。
你的所有示例都只有一个字符长度,除了倒数第二个是两个字符,最后一个是零个字符。(有些是char
类型,只定义了一个字符。)
char
的字节数始终为1。请编辑答案。 - Luchian Grigore'n' - 0x6e
"n" - 0x6e00
'\n' - 0x0a
"\n" - 0x0a00
"\\n" - 0x5c6e00
"" - 0x00
您似乎在谈论字符串常量,以及将它们与字符常量区分开来。
char
在所有架构上都是一个字节。字符常量使用单引号分隔符'
。
字符串是一系列连续的字符,其中包含一个尾随的 NUL 字符以标识字符串的结尾。字符串使用双引号字符 '"'。
此外,您介绍了 C 字符串常量表达式语法,该语法使用反斜杠来指示特殊字符。在字符串常量中,\n
是一个字符。
因此,对于示例 'n',"n",'\n',"\n"
:
'n'
是一个字符
"n"
是一个具有一个字符的字符串,但它需要两个字符的存储空间(一个用于字母n
,一个用于 NUL)
'\n'
是一个字符,换行符(在基于 ASCII 的系统上为 ctrl-J)
"\n"
是一个字符加上一个 NUL。
我让其他人根据这些来解决问题。
'n'
-> 一个 char
,char
总是 1 个字节。这不是一个字符串。
"n"
-> 一个字符串常量,包含一个 n
和一个终止的 NULL char
。因此为 2 个字节。
'\n'
-> 一个 char
,char
总是 1 个字节。这不是一个字符串。
"\n"
-> 一个字符串常量,包含一个 \n
和一个终止的 NULL char
。因此为 2 个字节。
"\\n"
-> 一个字符串常量,包含一个 \
,一个 '\n' 和一个终止的 NULL char
。因此为 3 个字节。
""
-> 一个字符串常量,包含一个终止的 NULL char
。因此为 1 个字节。
如果使用UTF8,一个字符占用1个字节;如果使用UTF16,一个字符占用2个字节。无论字节是00000001还是10000000,一旦声明初始化,一个完整的字节就被注册并保留给该字符,如果字符发生变化,则更新该寄存器的新值。
一个字符串的字节数等于""之间的字符数。
例如:11111111是一个填充的字节, UTF8字符T = 01010100(1个字节)
UTF16字符T = 01010100 00000000(2个字节)
UTF8字符串"coding" = 011000110110111101100100011010010110111001100111(6个字节)
UTF16字符串"coding" = 011000110000000001101111000000000110010000000000011010010000000001101110000000000110011100000000(12个字节)
UTF8 \n = 0101110001101110(2个字节)
UTF16 \n = 01011100000000000110111000000000(4个字节)
注意:每个空格和每个字符在编译器中占用1-2个字节,但有很多空间,除非您正在为90年代早期带有4MB或更少的计算机或游戏机键入代码,否则不必担心字符串或char的字节数。
std::string
还是以空字符结尾的char*
? - Luchian Grigore