为什么char字面量的sizeof与char类型的sizeof不同?

7
该程序。
#include <stdio.h>
int main(void) {
    printf("sizeof( char ) = %zu, sizeof 'a' = %zu.\n", sizeof( char ), sizeof 'a' );
    return 0;
}

输出以下结果:

sizeof( char ) = 1, sizeof 'a' = 4.

我正在使用gcc进行编译(clang的结果相同),同时还使用了以下标志:

gcc -Wall -Wextra -Wswitch -pedantic -ansi -std=c11 -DDEBUG -ggdb3 -o

规范文件 http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf 中第6.5.3.4节第4段规定:

4. 对于类型为 char、unsigned char 或 signed char(或带限定符版本)的操作数应用 sizeof 运算符,结果为 1。

因此,如果操作数 'a' 的类型为 char,我希望其 sizeof 的结果为 1。它会自动“提升”为 int 类型或类似的类型吗?(我注意到,如果将 'a' 强制转换为 char,则 sizeof((char)'a') 的结果为 1。)

或者我查看的标准不正确吗?


1
a 在基于 ASCII 的机器上与 97 完全等价。 - ikegami
这个问题似乎吸引了比链接的重复问题更详细的答案。反转重复问题可能是有意义的。由于我已经回答了这个问题,我会把这个决定留给其他人。 - dbush
@dbush 我同意,我不知道那篇帖子为什么会得到那么多赞,而且它似乎把重点放在了C vs C++上。最古老的帖子并不一定是最好的帖子!我会投票支持重新开放。 - Lundin
Lianne Connolly,C语言没有“_char字面量_”。它定义了_字符常量_。 - chux - Reinstate Monica
不是的,即使在提升考虑之前,“a”的类型也是int - chux - Reinstate Monica
显示剩余2条评论
4个回答

7
在C语言中,与C++不同的是,整数字面值(常量)拥有int类型。sizeof('a')表达式的值等于sizeof(int)表达式的值。而sizeof(char)始终等于1
根据C标准(6.5.3.4 The sizeof and alignof operators):

4 当sizeof应用到具有char、unsigned char或signed char类型(或其限定版本)的操作数时,结果为1...

而根据(6.4.4.4 Character constants):

10 整型字符常量的类型为int。 包含映射到单字节执行字符的单个字符的整型字符常量的值是解释为整数的映射字符的表示形式的数值。包含超过一个字符(例如'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量是实现定义的。如果整型字符常量包含单个字符或转义序列,则其值是将值为该单个字符或转义序列的char类型对象转换为int类型的结果。

需要注意的是,通常作为操作数或表达式中使用的char类型对象会由于整数提升而转换为int类型。

5

字符常量(或者更确切地说是 整型字符常量)的类型为 int

C标准文献C standard第6.4.4.4节描述了字符常量:

一个整型字符常量是由一个或多个多字节字符构成的序列,用单引号括起来,例如 'x'。一个宽字符常量也是如此,只不过以字母 Lu 或者 U 为前缀。除了稍后详细描述的几个例外情况,序列中的元素可以是源字符集的任意成员;它们按照实现定义的方式映射到执行字符集的成员。

语义上的描述,包括对类型的说明在第10段中首次出现:

一个整数字符常量的类型是int。包含一个映射到单字节执行字符的单个字符的整数字符常量的值是表示映射字符的数字值,解释为整数。包含多个字符(例如'ab')或包含不映射到单字节执行字符的字符或转义序列的整数字符常量的值是实现定义的。如果整数字符常量包含单个字符或转义序列,则其值是将值为该单个字符或转义序列的char类型对象转换为int类型时得到的值。

2
在C语言中,字符字面量并不是char类型。C将字符字面量视为整数。因此,sizeof('a')sizeof(1)没有区别。
字符字面量的大小等于整数的大小。

C语言中没有定义“字符字面量”,但是它确实定义了“字符常量”。 - chux - Reinstate Monica

0

'a' 具有整型,并且sizeof('a') 给出了 int 的大小。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接