为什么sizeof(';c';)返回4而不是1?

为什么sizeof(';c';)返回4而不是1?,c,C,可能重复: 为什么sizeof('c')返回4而不是1?因为在c中,字符常量的类型是int,而不是char。所以sizeof('c')==sizeof(int)。参考这个 也许令人惊讶的是,C中的字符常量是int类型的,所以 SIZEOF(“A”)是SIZEOF(int)(虽然这是C++的另一个领域) 不同) 下面是著名的C一书中著名的一行,作者是Kernighan&Ritchie,关于单引号之间的字符 在单引号之间写入的字符表示一个整数值,该整数值等于机器字符集中字符的数值 因此sizeo

可能重复:


为什么
sizeof('c')
返回4而不是1?

因为在c中,字符常量的类型是
int
,而不是
char
。所以
sizeof('c')==sizeof(int)
。参考这个

也许令人惊讶的是,C中的字符常量是int类型的,所以 SIZEOF(“A”)是SIZEOF(int)(虽然这是C++的另一个领域) 不同)


下面是著名的
C
一书中著名的一行,作者是
Kernighan&Ritchie
,关于单引号之间的字符

在单引号之间写入的字符表示一个整数值,该整数值等于机器字符集中字符的数值

因此
sizeof('a')
相当于
sizeof(int)


这个问题是cnicutar的翻版,当然完全正确。我只是想补充一下原因。如果查看函数行
fgetc
,您会注意到它还返回一个int。这是因为char可以表示从
0x00
0xFF
的任何字符,但需要一个附加值来表示EOF。因此,从输入或文件返回字符的函数通常返回int,这可以与EOF进行比较,EOF通常被定义为
-1
,但它可以是任何无效字符。

一个(可能更极端)的奇怪之处也在某种程度上证明了这一点,事实上,字符文字不限于单个字符

试试这个:

printf("%d\n", 'xy');
这有时在处理使用32位“块”标识符的二进制文件格式时很有用,例如。您可以这样做:

const int chunk = read_chunk_from_file(...);
if(chunk == 'IHDR')
  process_image_header(...);

这样的代码可能存在可移植性问题,当然,上面的代码片段假设
read\u chunk\u from\u file()
神奇地将PNG文件中的big-endian 32位值转换为与相应的多字符文字值匹配的值。

Wow,你每天都能学到新东西。我一定很喜欢C的这种疯狂的小怪事。这个K&R句子与C中字符常量的类型
int
无关。
char
short
甚至
\u Bool
都是整数。@ouah你能详细说明一下你的第一句话吗?w、 r.t第二条语句,您可以将
enum
添加到列表中+1在所有平台上,
'IHDR'
是否等同于相同的东西?@cnicutar:根据C标准,不,它完全是由实现定义的。不过,gcc在所有方面都是一样的。(相同的值,不同的表示…@cnicutar:我不这么认为,不。。。这就是为什么我写了关于从文件()读取块的部分需要智能才能支持此用法。@如果“x”给出ascii码,则展开“xy”给出了什么?实际上,
EOF
要求为负数,因此与转换为
int
的无符号字符的任何可能值不相交,除非
int
的宽度与
char\u位
相同。
const int chunk = read_chunk_from_file(...);
if(chunk == 'IHDR')
  process_image_header(...);