2012-02-21 108 views
6

我在做第一学期C++课程的回顾,我想我错过了一些东西。字符串占用了多少字节?字符?一个字符串需要多少个字节?字符?

我们给出的例子是,有些是字符文字和有些是字符串:

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

我尤其换行符在那里的使用混淆。

+0

“string”,你的意思是'std :: string'还是一个null结尾的char *'? – 2012-02-21 20:13:02

回答

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

单引号表示字符,双引号表示有一种无形的NUL终止C风格的字符串。

\n(换行符)只是一个字符,所以是\\(反斜杠)。 \\n只是后面跟n的反斜杠。

+2

如果你解释这是家庭作业,我会+1。 – Pubby 2012-02-21 20:15:09

+2

如果您将'std :: endl'更改为''\ n'',我会为您+1。 – 2012-02-21 20:16:11

+12

@Rob:由于''\ n''已经是作业的一部分,我不想不必要地混淆Moshe。 – fredoverflow 2012-02-21 20:18:15

1

字符串占用的字节数等于字符串中的字符数加1(终止符),乘以每个字符的字节数。每个字符的字节数可能会有所不同。对于常规的char类型,它是1个字节。

除了倒数第二个,这是两个,最后一个是零,所有的例子都是一个字符。 (有些是char类型的,并且仅限定一个单一的字符。)

+0

每个字符的字节数是1. **始终**。请编辑答案。 – 2012-02-21 20:15:15

+0

'char'由定义1字节,但是一个字节可能不是8位。 – Pubby 2012-02-21 20:15:32

+0

@Joe:C标准明确表示:1字节必须至少8位,但可以更多。 – ildjarn 2012-02-21 20:19:43

5
  • char,根据定义,占用一个字节。
  • 使用'的文字是char文字;使用"的文字是字符串文字。
  • 一个字符串文字隐含地以空字符结尾,因此它将占用字面值中可观察字符数的一个字节。
  • \是转义字符,而\n是换行符。

把这些放在一起,你应该能够弄明白。

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

下面就带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:我已经写了一些非常愚蠢的,感谢鸣叫鸭指出了这一点。

+1

实际上,sizeof(“n”)应该等于2.类型“ n“不是'const char *',而是'const char [2]',它是两个字节。 – 2012-02-21 20:20:57

+0

Mooing Duck - true,my bad – 2012-02-21 20:21:35

0

您似乎指的是字符串常量。并将它们与字符常量区分开来。

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

字符串是一个连续的字符序列,带有尾随的NUL字符以标识字符串的结尾。一个字符串使用双引号字符'''。

此外,您还介绍了C字符串常量表达式语法,它使用黑色斜线来指示特殊字符。\n是一个字符串常量中的一个字符。

所以对于例子'n', "n", '\n', "\n"
'n'是一个字符
"n"是一个字符的字符串,但它需要的存储(一个两个字符为字母n,一个用于NUL
'\n'是一个字符,换行(按Ctrl-J基于ASCII系统)
"\n"是一个字符加上一个NUL。

我离开的人基于这些解出。

+0

's/constants/literals /' – 2012-02-21 20:28:57

1

'n' - >一个char。 A char总是1个字节。这不是一个字符串。
"n" - >一个字符串文字,包含一个n和一个终止NULL char。所以2个字节。
'\n'→One char,A char总是1个字节。这不是一个字符串。
"\n" - >一个字符串文字,包含一个\n和一个终止NULL char。所以2个字节。
"\\n" - >一个字符串文字,包含一个\,一个'\ n'和一个终止NULL char。所以3个字节。
"" - >一个字符串文字,包含一个终止NULL char。所以1个字节。

2
  • 'n':不是字符串,是文字字符,一个字节,字符n的ascii码。
  • "n":字符串,两个字节,一个用于n,一个用于空字符,每个字符串都在末尾。
  • "\n":两个字节为\ n代表需要一个字节的“新行”,加上空字符的一个字节。
  • '\n':与第一个相同,文字字符,不是字符串,一个字节。
  • "\\n":三个字节..一个用于\,一个用于换行符和空字符
  • "":一个字节,只是空字符。
+0

详细说明“string”(C string?'std :: string'?字符串文字?)为了清晰度胜利。 – 2012-02-21 20:28:19

+0

对不起,我的意思是C字符串。 – gztomas 2012-02-21 21:29:40

相关问题