代码之家  ›  专栏  ›  技术社区  ›  RCIX

弦乐基础

  •  0
  • RCIX  · 技术社区  · 14 年前

    好吧,我一直都知道计算机把字符串当作一系列数字来处理,但我从来没有真正研究过它的工作原理。例如,当我们执行以下操作时,在一般的编译器/处理器中会发生什么样的魔力?

    string myString = "foo";
    myString += "bar";
    print(myString) //replace with printing function of your choice
    
    4 回复  |  直到 14 年前
        1
  •  1
  •   Brian R. Bondy    14 年前

    答案完全取决于所讨论的语言。但C语言通常是一种很好的语言,可以看到幕后的事情是如何发生的。

    char

    char str[1024];
    strcpy(str, "hello ");
    strcpy(str, "world!");
    

    幕后str[0]=='h'(有一个int值),str[1]=='e'。。。

    字符只是一个可以包含256个值之一的数字。每个字符都有一个数值。

    字符串的支持方式与C相同,但也有 string

    字符串文字是静态存储的一部分,不能直接更改,除非您需要未定义的行为。

    在C#:

    字符串是不可变的。这意味着一旦创建了字符串,就不能直接更改它。当您执行+=时,将创建一个新字符串,您的字符串现在引用该新字符串。

        2
  •  1
  •   Noldorin    14 年前

    char[]

    string myString = "foo";
    
    • 为数组分配3个字节的内存,并将第一个字节的值设置为“f”(而不是其ASCII代码),第二个字节设置为“o”,第二个字节设置为“o”。

    2.

    foo += "bar";
    
    • foo

    • 分配6个字节的内存,前3个字节填充 ,接下来的3个字节 b , a ,和 r .

    print(foo)
    
    • 读字符串 现在指向内存,并将其打印到屏幕上。

    这是一个相当粗略的概述,但希望能给你大致的想法。

    在某些语言/计算机中,char!=字节—例如,C#,其中字符串默认以Unicode格式存储,特别是字符串的长度也存储在内存中。C++通常使用空终止的字符串,它以另一种方式解决问题,尽管它意味着确定其长度为O(n)而不是O(1)。

        3
  •  0
  •   David Pfeffer    14 年前

    它非常依赖于语言。但是,在大多数情况下,字符串是 immutable ,这样做将分配一个新字符串并释放旧字符串的内存。

        4
  •  0
  •   Hans Olsson    14 年前

    我假设您的示例中有一个输入错误,并且只有一个变量叫做foo或myString,而不是两个变量?


    在其他语言中,它的工作方式会有所不同。