为什么C不使用特殊的转义字符串终止字符终止字符串?

akw*_*way 17 c string null escaping

在C中,字符串以null(\ 0)结尾,当您想在字符串中放置null时会导致问题.为什么不使用特殊的转义字符,例如\ $或其他东西?

我完全清楚这个问题是多么愚蠢,但我很好奇.

Dan*_*ral 39

以0结尾具有许多性能细节,这在60年代后期非常相关.

CPU具有条件跳转测试为0的指令.实际上,一些CPU甚至具有将字节序列迭代/复制到0的指令.

如果您使用转义字符,则有两个测试两个不同的字节来断言字符串的结尾.这不仅速度较慢,而且您无法一次迭代一个字节,因为您需要前瞻或回溯的能力.

现在,其他语言(咳嗽,帕斯卡,咳嗽)使用计数/值样式的字符串.对于他们来说,任何字符都是有效的,但它们总是保持一个字符串大小的计数器.优点很明显,但这种技术也有缺点.

首先,字符串大小受计数所需的字节数限制.一个字节为您提供255个字符,两个字节为您提供65535等.今天几乎无关紧要,但每次为每个字符串添加两个字节非常昂贵.

编辑:

我不认为这个问题是愚蠢的.在当今具有内存管理,令人难以置信的CPU能力和大量内存的高级语言的情况下,过去的这些决定似乎毫无意义.而且,实际上,它们现在可能毫无意义,因此质疑它们是件好事.

  • 提及CPU的+1.你的"一些CPU"包括英特尔的x86指令集(尽管这些指令可能不再使用了很多). (5认同)
  • 如果您定义自己的字符串结构,则可以使大小为字节的255值,表示后面是另一个大小的字节. (2认同)
  • 在许多情况下,性能特征在今天仍然相关.这在嵌入式系统和内核/驱动程序开发中非常重要,在这种情况下,您仍然需要抓住并节省每个CPU周期.这就是为什么C仍然是这些领域的王者. (2认同)

Ric*_*dle 13

您需要有一些实际的字节值来终止字符串 - 您在代码中表示它的方式并不真正相关.

如果您曾经\$终止字符串,它在内存中会有什么字节值?你如何在字符串中包含该字节值?

如果使用特殊字符来终止字符串,那么无论你做什么,都会遇到这个问题.另一种方法是使用计数字符串,其中字符串的表示包括其长度(例如BSTR).

  • 但是没有"未使用"的字节值.任何字节都可以出现在C字符串中 - 您可能会说选择了\ 0因为它未被使用. (4认同)