字符常量的C编码

我的程序员的本能会说c中的字符常量(例如:’x’)是使用编译它的机器上的机器字符集编码的。 但是,以下内容来自“C编程语言:ANSI C版”

“字符常量是用单引号括起来的一个或多个字符的序列,如’x’。只有一个字符的字符常量的值是执行时机器字符集中字符集的数值。”

强调最后3个字。

任何人都可以解释为什么他们会说“在执行时”。 当然,字符值是在编译的二进制文件(或ELF,A.OUT ……)中编码的?

我在想,但无法为此提出任何合理的解释,肯定K&R知道他们在做什么!

您必须告诉编译器您要在哪个系统上运行该程序。 然后,它将为字符选择正确的编码。

当然,默认是在类似于运行编译器的系统上运行。 在这种情况下,编译时和运行时字符集将是相同的。

C区分源字符集和执行字符集,因为您的编译器可能是交叉编译器,例如在用于移动平台的PC上。 然后计算机上的字符集和目标计算机上的字符集必须不同意。 最简单的例子是EOL编码,这在当今市场上不同的通用平台之间是不同的。 执行字符集还可以取决于“区域设置”和由运行程序的用户动态设置的其他旋钮。

您的问题似乎在于您使用字符编码混淆了机器的字符集。

请阅读http://www.microsoft.com/typography/unicode/cs.htm以了解字符集的实际含义。 KnR(第2版)时的问题是计算机太多,有些是为当地政府和公众制造的。 这导致在两台计算机之间弹出不同的字符集,因此,美国机器上的“A”是俄罗斯机器上的西里尔字符(比如说Foo)。

因此,字符常量不能被信任。 现在感谢现代计算机制造商,机器中的大多数字符集都是相同的,信息交换更简单。

在C语言术语中,数据是针对特定语言环境编码的,而语言环境声明了字符集。 程序具有执行字符集。 编译到程序中的文本(字符串和字符常量)将在该执行字符集中表示。 程序本身可以将从任何语言环境的字符集读取的文本转换为其自己的执行字符集,并根据任何语言环境的字符集格式化它生成的文本。

“机器在执行时的字符集”措辞严厉,它暗示了不存在或不存在的事物。