我正在学习物理,在我们的编程课程的讲义中,写了一个字符常量,在C中有 char 类型,其中字符常量我的意思是像那样的表达式X'即可。 在询问我的讲师是否是一个错误之后,他说不。在向他展示C90,C99和C11之后,清楚地写明了一个字符常量类型 int ,他仍然没有说这是一个错误。
所以在再次问他之前,我想向自己保证我的方法是正确的,为什么会这样,因为它似乎浪费了记忆。 我发现的一切都是为什么会这样,是因为历史原因,这是相当含糊的。 另外我想知道为什么在C ++中,他们将字符常量的类型更改为 char 。
编辑:非常感谢答案。答案 0 :(得分:6)
Online C language standard, 2011 draft:
6.4.4.4字符常量
...
2整数字符常量是包含的一个或多个多字节字符的序列 在单引号中,如'x'
中所示。宽字符常数是相同的,除了预先固定的 字母L
,u
或U
。除了稍后详述的一些例外,序列的元素是 源字符集的任何成员;它们映射在一个实现定义中 对执行字符集成员的态度 ...
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 -m32
或gcc -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
,因为它正朝着更强的打字方向发展,目的是减少人为错误。