int main(void)
{
printf("%d %d\n", sizeof('c'), sizeof(char));
return 0;
}
为什么sizeof('c')
会返回4而不是1?
答案 0 :(得分:16)
因为在C字符常量中具有类型int
,而不是char
。所以sizeof('c') == sizeof(int)
。请参阅此C FAQ
也许令人惊讶的是,C中的字符常量的类型为int ,所以 sizeof('a')是sizeof(int)(尽管这是C ++的另一个区域 不同)。
答案 1 :(得分:4)
一种(可能甚至更极端)奇怪的是,这也是某种方式证明这一点,是字符文字不仅限于单个字符这一事实。
试试这个:
printf("%d\n", 'xy');
这有时在处理例如使用32位“块”标识符的二进制文件格式,例如PNG。你可以这样做:
const int chunk = read_chunk_from_file(...);
if(chunk == 'IHDR')
process_image_header(...);
这样的代码可能存在可移植性问题,当然上面的代码片段假设read_chunk_from_file()
神奇地做了正确的事情,将PNG文件中找到的big-endian 32位值转换为匹配的东西相应的多字符字符文字的值。
答案 2 :(得分:2)
以下是来自着名C
书籍的着名专栏 - The C programming Language
Kernighan & Ritchie
关于单引号之间的字符。
在单引号之间写入的字符表示一个整数值,该值等于机器字符集中字符的数值。
因此sizeof('a')
相当于sizeof(int)
答案 3 :(得分:1)
cnicutar当然是完全正确的。我只想补充其中的原因。如果你看一下函数行fgetc
,你会发现它也返回一个int。这是因为char可以表示从0x00
到0xFF
的任何字符,但是为了表示EOF需要一个额外的值。因此,从输入或文件返回字符的函数通常返回一个int,可以将其与EOF进行比较,EOF通常定义为-1
,但它可以是任何不是有效字符的东西。