字符常量的类型
我正在学习物理,在我们的编程课程的讲义中,写了一个字符常量,在C中有char类型,其中字符常量我的意思是像‘x’这样的表达式。 在询问我的讲师是否是一个错误后,他说没有。 在向他展示了C90,C99和C11之后,在那里明确写出一个字符常量具有int类型,他仍然没有说这是一个错误。
所以在再次问他之前,我想向自己保证我的方法是正确的,为什么会这样,因为它似乎浪费了记忆。 我发现的一切都是为什么会这样,是因为历史原因,这是相当含糊的。 另外我想知道为什么在C ++中,他们将字符常量的类型更改为char 。
编辑:非常感谢你的答案。
在线C语言标准,2011年草案 :
6.4.4.4字符常量
…
2整数字符常量是用单引号括起来的一个或多个多字节字符的序列,如'x'
。 宽字符常数是相同的,除了由字母L
,u
或U
预先固定。 稍后将详述一些例外,序列的元素是源字符集的任何成员; 它们以实现定义的方式映射到执行字符集的成员。
…
10整数字符常量的类型为int
。 包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值。 包含多个字符(例如,'ab'
)的整数字符常量的值,或包含不映射到单字节执行字符的字符或转义序列的值是实现定义的。 如果整数字符常量包含单个字符或转义序列,则其值是当char
的类型为单个字符或转义序列的对象转换为int
类型时生成的值。
所以是的,在C中,单个字符常量(如'x'
类型为int
。
为什么会出现这种情况,AFAIK在很大程度上失去了历史1 ,尽管我怀疑它是在与 getchar
(返回一个int
)的结果进行比较或使用像printf
这样的变量printf
(它会自动提升任何表达式)时最小化转换类型为char
to int
)。
由于C ++为I / O和类型generics操作提供了替代机制,因此字符常量具有类型char
是有意义的。
这在实践中是否重要? 不是我的经验,但我在文本处理方面的经验并不那么广泛。
我应该真正阅读我从标准中复制的内容; 原因在那个片段中给出。 您可以使用多个字符常量,例如'abc'
,它不会逻辑映射到单个char
值。
现在看一下有人从里奇或克尼汉那里找到一个广泛的引用,解释他们为什么这么做
您可能会发现此代码阐明:
#include 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
我希望这有帮助。
从经验来看,当C年轻时,表达式主要在int
工作更简单。 早期的编译器比现在的编译器复杂得多。 此外,编程语言通常不像现在那样强类型。
字符常量具有int
类型并不浪费内存,因为C标准没有指定它们必须如何保存在内存中。 只有对象,例如用int d;
声明的对象int d;
必须分配内存(甚至经常只在C的抽象计算模型中,不一定在真实的计算机中)。 只要结果正确,AC实现可以以任何方式将执行程序的指令引入字符常量的值。 例如,它可以将值存储在指令中的立即字段的几位中,而不使用int
所需的所有空间。
我希望C ++将字符常量的类型更改为char
因为它正朝着更强的打字方向发展,目的是减少人为错误。