字符常量的类型

时间:2013-12-24 17:17:31

标签: c types character constants

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

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

编辑:非常感谢答案。

3 个答案:

答案 0 :(得分:6)

Online C language standard, 2011 draft

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

所以是的,在C中,'x'等单个字符常量的类型为int

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

<击>

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

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

我应该真正阅读我从标准中复制的内容;原因在该片段中给出。您可以使用char等多字符常量,这些常量不会逻辑映射到单个'abc'值。

<小时/> <击> 1。现在看一些人从Ritchie或Kernighan那里找到一个广泛的引用,解释他们为什么这么做了

答案 1 :(得分:1)

您可能会发现此代码阐明:

#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

我希望这会有所帮助。

答案 2 :(得分:1)

根据经验,当C年轻时,表达式主要在int中工作更为简单。早期的编译器比今天的编译器复杂得多。此外,编程语言通常不像现在那样强类型。

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

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