String 字符串基础
好吧,我一直都知道计算机在封面下把字符串看作一系列数字,但我从来没有真正研究过它是如何工作的细节。例如,当我们执行以下操作时,在一般的编译器/处理器中会发生什么样的魔力String 字符串基础,string,String,好吧,我一直都知道计算机在封面下把字符串看作一系列数字,但我从来没有真正研究过它是如何工作的细节。例如,当我们执行以下操作时,在一般的编译器/处理器中会发生什么样的魔力 string myString = "foo"; myString += "bar"; print(myString) //replace with printing function of your choice 它非常依赖于语言。但是,在大多数情况下,字符串都是,这样做会分配一个新字符串并释放旧字符串的内存。我假设您的示例
string myString = "foo";
myString += "bar";
print(myString) //replace with printing function of your choice
它非常依赖于语言。但是,在大多数情况下,字符串都是,这样做会分配一个新字符串并释放旧字符串的内存。我假设您的示例中有一个输入错误,并且只有一个变量称为foo或myString,而不是两个变量 我得说,这在很大程度上取决于您使用的编译器。在.Net中,字符串是不可变的,因此当您添加“bar”时,实际上并不是在添加它,而是创建一个包含“foobar”的新字符串,并告诉它将其放入变量中。
在其他语言中,它的工作方式不同。答案完全取决于所讨论的语言。但是C语言通常是一种很好的语言,可以看到幕后发生的事情 在C语言中: 在C语言中,字符串是字符的数组,末尾是0:
char str[1024];
strcpy(str, "hello ");
strcpy(str, "world!");
幕后str[0]=“h”(具有int值),str[1]=“e”。。。
str[11]=='!',str[12]=='\0'
字符只是一个数字,可以包含256个值中的一个。每个字符都有一个数值
C++中的:
字符串的支持方式与C相同,但您也有一个string
类型,它是STL的一部分
字符串文字是静态存储的一部分,不能直接更改,除非您想要未定义的行为
字符串类型在幕后的实际工作方式取决于实现,但字符串对象本身是可变的
在C#中:
字符串是不可变的。这意味着您不能在创建字符串后直接更改它。当您执行+=时,将创建一个新字符串,并且您的字符串现在引用该新字符串。当然,实现在语言和编译器之间有所不同,但对于C语言,它通常如下所示。注意,字符串本质上是C中字符数组(
char[]
)的语法糖
一,
- 为数组分配3个字节的内存,并将第一个字节的值设置为“f”(而是ASCII码),第二个字节设置为“o”,第二个字节设置为“o”
- 从
指向的内存中读取现有字符串(字符数组)foo
- 分配6个字节的内存,用
的读取内容填充前3个字节,用foo
、b
和a
填充后3个字节r
- 从内存中读取字符串
现在指向,并将其打印到屏幕上foo
旁注:在某些语言/计算机中,char!=字节-例如,C#,其中字符串默认以Unicode格式存储,特别是字符串的长度也存储在内存中。C++通常使用空终止的字符串,它以另一种方式解决问题,尽管它意味着确定其长度是O(n)而不是O(1).</P>哪种编程语言?C++?用什么语言?答案完全取决于语言。在某些语言中,字符串是不可变的;在其他国家,情况并非如此。有些语言有不同类型的字符串。一个真正的智能编译器甚至可以得出结论:
print(“foobar”)
——这取决于语言/运行时/合同义务和“智能性”,我想我正在寻找一个关于字符串如何在没有语法糖衣的情况下工作的“大旅行”。不过,您可以省去特殊类型的字符串(没有一种是我马上想到的)。
string myString = "foo";
foo += "bar";
print(foo)