好吧,我一直都知道计算机将字符串视为一系列数字,但我从未真正了解它的工作原理。例如,当我们这样做时,平均编译器/处理器会发生什么样的魔力呢?
string myString = "foo";
myString += "bar";
print(myString) //replace with printing function of your choice
答案 0 :(得分:1)
答案完全取决于所讨论的语言。但是C通常是一种很好的语言,可以看到幕后发生的事情。
在C:
在C字符串中是char
的数组,最后为0:
char str[1024];
strcpy(str, "hello ");
strcpy(str, "world!");
幕后str [0] =='h'(有一个int值),str [1] =='e',... str [11] =='!',str [12] =='\ 0';
char只是一个可以包含256个值之一的数字。每个字符都有一个数值。
在C ++中:
字符串的支持方式与C相同,但您也有string
类型,它是STL的一部分。
字符串文字是静态存储的一部分,除非您需要未定义的行为,否则无法直接更改。
它的实现依赖于字符串类型在幕后实际工作的方式,但字符串对象本身是可变的。
在C#中:
字符串是不可变的。这意味着一旦创建了字符串,就不能直接更改它。当你做+ =发生的事情是新的字符串被创建,你的字符串现在引用新的字符串。
答案 1 :(得分:1)
当然,实现在语言和编译器之间有所不同,但通常对于C来说,它类似于以下内容。请注意,字符串基本上是C语言中的char数组(char[]
)的语法糖。
1
string myString = "foo";
2
foo += "bar";
从foo
指向的内存中读取现有字符串(char数组)。
分配6个字节的内存,使用foo
的读取内容填充前3个字节,使用b
,a
和{{1}填充接下来的3个字节}}
3
r
print(foo)
,并将其打印到屏幕上。这是一个非常粗略的概述,但希望能给你一般的想法。
旁注:在某些语言/编译器中,char!= byte - 例如,C#,其中字符串默认以Unicode格式存储,特别是字符串的长度也存储在记忆。 C ++通常使用以null结尾的字符串,它以另一种方式解决问题,但这意味着确定其长度为O(n)而不是O(1)。
答案 2 :(得分:0)
它非常依赖语言。但是,在大多数情况下,字符串是immutable,所以这样做会分配一个新字符串并释放旧字符串。
答案 3 :(得分:0)
我假设你的样本中有一个拼写错误,并且只有一个名为foo或myString的变量,而不是两个变量?
我会说它很大程度上取决于你正在使用的编译器。在.Net字符串是不可变的,所以当你添加“bar”时,你实际上并没有添加它,而是创建一个包含“foobar”的新字符串,并告诉它将它放在你的变量中。
在其他语言中,它将以不同的方式工作。