一个字符串占用多少字节?一个字符呢?

20

我正在回顾我上过的第一个C++学期课程,我感觉自己有点遗漏了什么。一个字符串占用多少字节? 一个字符呢?

我们被给予的一些示例是字符字面值和字符串:

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

我特别困惑其中换行符的使用。


1
你所说的“string”,是指std::string还是以空字符结尾的char* - Luchian Grigore
9个回答

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


3
如果你将 std::endl 改成 '\n',我会给你点赞(+1)。 - Robᵩ
22
@Rob: 因为 '\n' 已经包含在这个赋值语句中了,我不想没必要地让 Moshe 困惑。 - fredoverflow
11
我之前没有考虑到使用std::endl的一个合理原因。+1 - Robᵩ

12
  • 'n': 不是字符串,是一个字面意义的字符,一个字节,代表字母n的字符编码。
  • "n": 字符串,两个字节,一个为n,另一个为每个字符串末尾的空字符。
  • "\n": 两个字节,\n表示“新行”,需要一个字节,加上一个字节的空字符。
  • '\n': 与第一个相同,字面意义的字符,不是字符串,一个字节。
  • "\\n": 三个字节,一个为反斜杠,一个为换行符,一个为空字符。
  • "": 一个字节,就是空字符。

详细说明 "字符串" (C 字符串?std::string?字符串字面量?),以便更清晰地理解。 - Lightness Races in Orbit

7
  • 根据定义,char 占用一个字节。
  • 使用 ' 的文本是字符文字;使用 " 的文本是字符串文字。
  • 字符串文字隐式以 null 结尾,因此其占用的字节数会比可观察到的字符数多一个字节。
  • \ 是转义字符,\n 是换行符。

将它们组合起来,你就应该能够理解了。


5
以下将获取内存中的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

编辑:格式修正

编辑2:我写了一些非常愚蠢的东西,感谢Mooing Duck指出。


1
实际上,sizeof("n")应该等于2。 "n"的类型不是const char *,而是const char [2],即两个字节。 - Mooing Duck

2

一个字符串所占用的字节数等于该字符串中字符的数量加1(终止符),再乘以每个字符所占用的字节数。每个字符所占用的字节数可能不同。对于普通的char类型,它占用1个字节。

你的所有示例都只有一个字符长度,除了倒数第二个是两个字符,最后一个是零个字符。(有些是char类型,只定义了一个字符。)


每个char的字节数始终为1。请编辑答案。 - Luchian Grigore
“char” 的定义是 1 字节,但是一个字节可能不是 8 位。 - Pubby
@Joe:C标准明确指出:一个字节必须至少是8位,但可以更多。 - ildjarn
@ildjarn 【感谢】(https://dev59.com/b2035IYBdhLWcg3wSN4G) - Joe

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

1

您似乎在谈论字符串常量,以及将它们与字符常量区分开来。

char 在所有架构上都是一个字节。字符常量使用单引号分隔符'

字符串是一系列连续的字符,其中包含一个尾随的 NUL 字符以标识字符串的结尾。字符串使用双引号字符 '"'。

此外,您介绍了 C 字符串常量表达式语法,该语法使用反斜杠来指示特殊字符。在字符串常量中,\n 是一个字符。

因此,对于示例 'n',"n",'\n',"\n"
'n' 是一个字符
"n" 是一个具有一个字符的字符串,但它需要两个字符的存储空间(一个用于字母n,一个用于 NUL)
'\n' 是一个字符,换行符(在基于 ASCII 的系统上为 ctrl-J)
"\n" 是一个字符加上一个 NUL。

我让其他人根据这些来解决问题。


1

'n' -> 一个 charchar 总是 1 个字节。这不是一个字符串。
"n" -> 一个字符串常量,包含一个 n 和一个终止的 NULL char。因此为 2 个字节。
'\n' -> 一个 charchar 总是 1 个字节。这不是一个字符串。
"\n" -> 一个字符串常量,包含一个 \n 和一个终止的 NULL char。因此为 2 个字节。
"\\n" -> 一个字符串常量,包含一个 \,一个 '\n' 和一个终止的 NULL char。因此为 3 个字节。
"" -> 一个字符串常量,包含一个终止的 NULL char。因此为 1 个字节。


0

如果使用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的字节数。
占用内存的问题是使用浮点数、小数或双精度调用需要重计算的事物,并在循环或更新方法中使用 math random。最好在运行时或固定时间更新上运行一次,并在时间跨度上进行平均。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接