在C中,为什么sizeof(char)1,当'a'是一个int?

我试过了

printf("%d, %d\n", sizeof(char), sizeof('c'));

得到了1,4作为输出。 如果angular色的大小是1,为什么'c'给我4? 我想这是因为它是一个整数。 所以当我做char ch = 'c'; 是否有一个隐式转换发生在引擎盖下,从4字节值到1字节值,当它被分配给字符variables?

在C中'a'是一个整数常量(!?!),所以4对于你的架构是正确的。 它被隐式转换为字符分配。 根据定义,sizeof(char)总是1。 标准没有说明单元1是什么,但它通常是字节。

Th标准说,像'a'这样的字符types是inttypes,而不是chartypes。 因此它(在你的平台上)sizeof == 4.看到这个问题的更充分的讨论。

这是sizeof运算符的正常行为(参见Wikipedia ):

  • 对于数据types, sizeof返回数据types的大小。 对于char ,你得到1。
  • 对于expression式, sizeof返回variables或expression式types的大小。 作为一个字符文字被键入为int ,你得到4。

这在ISO C11 6.4.4.4 Character constants有所说明,虽然与早期的标准大体没有变化。 第/10段指出:

整数字符常量的types为int。 包含映射到单字节执行字符的单个字符的整数字符常量的值是被解释为整数的映射字符的表示的数值。

根据ANSI C标准, char在使用整数的上下文中被提升为int ,因此在printf使用了一个整数格式说明符,因此具有不同的值。 字符通常是1个字节,但是这是基于运行时和编译器定义的实现。