看看这个程序
#include<stdio.h>
int main (){
char c='a';
printf("%d %d", sizeof(c),sizeof('a'));
}
Run Code Online (Sandbox Code Playgroud)
输出是1 4
我知道当我们写一个语句char c ='a';
那么如何在1字节(char c)的空间中存储一些4字节(ASCII码)的东西,为什么没有溢出等.
bdo*_*lan 15
首先,根据ANSI/IEC 9899:1999(E)§6.4.4.4:
10.整数字符常量的类型为int.包含映射到单字节执行字符的单个字符的整数字符常量的值是解释为整数的映射字符的表示的数值.[...]
§6.5.3.4:
2. sizeof运算符产生其操作数的大小(以字节为单位),可以是表达式或类型的带括号的名称.大小由操作数的类型确定.[...]
3.当应用于具有char,unsigned char或signed char(或其合格版本)类型的操作数时,结果为1. [...]
正如你所看到的,因为字符常量的类型是int
,对于sizeof('a')
我们得到的sizeof(int)
,这是4你的平台上.但是,对于sizeof(c)
,我们得到a的大小,char
定义为1.
那么为什么我们可以分配'a'
到char
?
§6.5.16.1:
2.在简单赋值(=)中,右操作数的值将转换为赋值表达式的类型,并替换存储在左操作数指定的对象中的值.
所以,int
那是'a'
隐式转换为a char
.这里也有一个例子,明确显示int
s可以隐式转换为char
.