【问题标题】:Type of character constant字符常量的类型
【发布时间】:2013-12-24 17:17:31
【问题描述】:

我正在学习物理学,在我们的编程课程的讲义中写到一个字符常量,在 C 中具有类型 char,其中字符常量是指像 ' 这样的表达式x'。 在问我的讲师这是否是一个错误之后,他说没有。在向他展示了 C90、C99 和 C11 之后,其中清楚地写了一个字符常量的类型为 int,他仍然没有说这是一个错误。

所以在再次问他之前,我想向自己保证我的方法是正确的,以及为什么会这样,因为这似乎是在浪费记忆。 我发现为什么会这样,是因为历史原因,这是相当模糊的。 另外我想知道为什么在 C++ 中,他们将字符常量的类型更改为 char

编辑:非常感谢您的回答。

【问题讨论】:

  • 链接的问题回答了 C 和 C++ 的原因。 C 标准回答了“技术”部分 - 是的,'x' 在 C 中属于 int,在 C++ 中属于 char
  • x (也是)一个字符文字,这可能有助于克服由措辞歧义引起的假设矛盾。
  • 他如何证明他的断言是正确的,而 ISO C 标准的所有三个版本都是错误的?
  • @KeithThompson:遵守标准是自愿的;标准机构对讲师没有法律、道德或专业管辖权,也没有“C”这个名字的商标或其他所有权利益。 :-)

标签: c types character constants


【解决方案1】:

Online C language standard, 2011 draft:

6.4.4.4 字符常量
...
2 整数字符常量是包含一个或多个多字节字符的序列 在单引号中,如'x'。宽字符常量是相同的,除了前缀 信 LuU。除了稍后详述的一些例外情况外,序列的元素是 源字符集的任何成员;它们被映射到实现定义的 以执行字符集成员的方式。
...
10 整数字符常量的类型为int。整数字符常量的值 包含映射到单字节执行字符的单个字符是 被解释为整数的映射字符表示的数值。 包含多个字符的整数字符常量的值(例如, 'ab'),或包含不映射到单字节的字符或转义序列 执行字符,是实现定义的。如果一个整数字符常量包含 单个字符或转义序列,其值是当对象具有 类型char,其值为单个字符或转义序列的值,转换为 输入int

所以是的,在 C 语言中,诸如 'x' 之类的单字符常量具有 int 类型。

为什么是这种情况,AFAIK 在很大程度上输给了历史1,尽管我怀疑这是为了在与 @ 的结果进行比较时最小化转换987654332@(返回int)或使用可变参数函数,如printf(会自动将char 类型的任何表达式提升为int)。

由于 C++ 为 I/O 和类型泛型操作提供了替代机制,因此字符常量具有类型 char 是有意义的。

这是否重要在实践中?不是我的经验,但我在文本处理方面的经验并不丰富。

我实际上应该阅读我从标准中复制的内容;原因在那个sn-p中给出。您可以拥有像'abc' 这样的多字符常量,它不会在逻辑上映射到单个char 值。


1。现在看看有人找到 Ritchie 或 Kernighan 的广泛引用,解释他们这样做的确切原因

【讨论】:

  • 这些多字符常量有什么用?
【解决方案2】:

您可能会发现这段代码说明了:

#include <stdio.h>
int main() {
    printf("size of char is %ld\n", sizeof(char));
    printf("size of const char is %ld\n", sizeof(const char));
    printf("size of int is %ld\n", sizeof(int));
    printf("size of 'x' is %ld\n", sizeof('x'));
}

请在您的系统上编译。在我的系统上(OS X,使用gcc -m32gcc -m64 编译),输出为:

size of char is 1
size of const char is 1
size of int is 4
size of 'x' is 4

我希望这会有所帮助。

【讨论】:

    【解决方案3】:

    从经验上讲,在 C 还年轻的时候,表达式主要在 int 中工作比较简单。早期的编译器远没有今天的编译器复杂。此外,编程语言通常不像现在这样强类型化。

    字符常量的类型为int 并不浪费内存,因为C 标准没有指定如何将它们保存在内存中。只有对象,例如用int d; 声明的对象必须分配内存(即使这样,通常也只在 C 的抽象计算模型中,不一定在真实计算机中)。只要结果正确,C 实现可以将字符常量的值引入以任何方式执行程序的指令。例如,它可以将值存储在指令中立即字段的几位中,而无需使用 anint 所需的所有空间。

    我希望 C++ 将字符常量的类型更改为 char,因为它正在朝着更强大的输入方向发展,目的是减少人为错误。

    【讨论】:

      猜你喜欢
      • 2014-12-14
      • 2017-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-15
      • 2020-01-07
      • 1970-01-01
      • 2019-03-20
      相关资源
      最近更新 更多