【问题标题】:Why delimiter on char? c-based为什么要在char上定界?基于 c 的
【发布时间】:2024-01-23 06:56:01
【问题描述】:

前几天我正在用 C# 编写一些代码,这让我开始思考。如果一个 char 文字只能有 1 个字符(或分隔字符),那么为什么我们需要结束分隔符?

例如,目前我们需要写:

char character = 's';

而且在任何情况下这都不起作用(显然):

char character = 'sa';

那为什么我们必须把结尾 ' 而不是暗示呢?例如:

char character = 's;
char anotherCharacter = '\';

可读性只会受到影响,因为我们已经习惯了当前的标准(不一定是因为这种方式可读性较差)。

【问题讨论】:

  • 空格、制表符、其他空格、Unicode 文字和分号如何工作?我只能假设为了可读性和降低全世界开发人员的一般精神科医生成本,因为他们可以保持一定的理智。
  • 你知道,多字符文字是有效的。
  • '\040', '\x20', 'Rsrc' - 最后一个是 C 中的 4 字节整数文字
  • @D.Shawley,不一定是四个字节,但是是的,它是一个 int
  • 旧 Apple Toolbox API 中的@chris 资源类型利用这一事实来制作非常易读的整数文字:)

标签: c# c++ c char literals


【解决方案1】:
  1. 这是一个约定
  2. 在这个 unicode 世界中,字符不一定用一个字符表示
  3. 控制/转义序列可以长于一个字符(例如 '\0x1a' )

【讨论】:

  • 我在问题中有一个转义字符的例子。
  • 想象一下您的输出将用于确定终端中文本格式的情况。您需要转义字符,即八进制的 '\033'。显然,唯一的表示由四个字符组成。 :D
  • @angel 如前所述,有效的转义序列将与以前一样工作(减去末尾的撇号)。
  • 假设任何合理的字符定义,一个字符总是表示为一个字符。问题是混合字符定义。
【解决方案2】:

在 C#、Java 和 C++ 中,答案很简单:

因为它是用 C 实现的。

为什么用 C 实现这种方式?

谁知道?在第一个 C 解析器/编译器中可能存在一些实现怪癖,使这个选择变得显而易见;我敢打赌,K&R 只是没有考虑到这一点。单引号看起来很奇怪。

【讨论】:

  • +1 可能是我迄今为止看到的最准确和正确的回复。我想知道他们为什么在 C 中这样做。单引号看起来很奇怪,因为我们习惯于将它用作开始和结束分隔符,而不仅仅是前缀(如 0x0000)。
  • 他们在 C 中这样做是因为 B(C 的前身)就是这样做的。这也是 BCPL 的做法,B 所基于的语言。我对 CPL 是如何做到的知之甚少。
  • @paxdiablo 是的,你是对的,这个决定可能受到 Algol 60、COBOL、Fortran 和当时任何其他语言的影响。
  • @paxdiablo IIRC,CPL 没有区分字符和长度为 1 的字符串。字符串在那里用单引号括起来。我一直在试图追查字符的概念而不是字符串的概念进入编程语言世界的位置。
【解决方案3】:

'abcd' 是多字符文字;它的类型是int,它的值是实现定义的。需要结束 ' 来标记文字的结尾。

【讨论】:

  • 我注意到这不适用于long long int 和其他大小的整数。即文字大于 4 chars.
【解决方案4】:

现有的 C 语法将 character-constant 定义为:

字符常量

' c-char-sequence '

L' c-char-sequence '

您的问题归结为为什么不能将其定义为:

字符常量

'c-char

L'c-char

嗯,它可以 - 从某种意义上说,这仍然是一个一致的可解析语法,并且您仍然能够表达单字符常量。你不能做的是表达多字符常量(例如'ab') - 这些是合法的,但具有实现定义的值。

我怀疑真正的原因仅仅是美学。例如,理论上也没有理由在 if 语句的条件表达式周围加上括号。

【讨论】:

  • 某些语言(例如 Basic-like 语言)在 if 和类似结构周围没有括号。
  • @MrUniverse:是的 - 在某些时候,它只是原始语言设计者认为看起来不错的东西。
  • 似乎这一切都归结为。