为什么 char 文字的 sizeof 与 sizeof(char) 不同?

Lia*_*lly 7 c sizeof char literals

该程序

#include <stdio.h>
int main(void) {
    printf("sizeof( char ) = %zu, sizeof 'a' = %zu.\n", sizeof( char ), sizeof 'a' );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出以下内容:

sizeof( char ) = 1, sizeof 'a' = 4.
Run Code Online (Sandbox Code Playgroud)

我正在使用 gcc 进行编译(clang 给出相同的结果)和这些标志:

gcc -Wall -Wextra -Wswitch -pedantic -ansi -std=c11 -DDEBUG -ggdb3 -o
Run Code Online (Sandbox Code Playgroud)

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

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

所以我希望操作数'a'的大小为1,因为'a'的类型是char,或者它是否被自动“提升”为int,或类似的东西?(我注意到,如果我将 'a' 转换为 char ,则 sizeof( (char)'a' ) 为 1)。

还是我看错了标准?

Vla*_*cow 7

在 C 中,与 C++ 相反,整数字符常量(文字)具有类型int

所以表达式的值sizeof( 'a' )等于表达式的值sizeof( int )。而sizeof( char )始终等于1

来自 C 标准(6.5.3.4 sizeof 和alignof 运算符)

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

和(6.4.4.4 字符常量)

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

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


dbu*_*ush 5

字符常量(或更准确地说,整数字符常量)的类型为int

C 标准的 6.4.4.4p2 节描述了字符常量:

整型字符常量是用单引号括起来的一个或多个多字节字符的序列,如 中所示'x'。宽字符常量是相同的,除了前缀为字母LuU。除了稍后详细介绍的一些例外情况外,序列的元素是源字符集的任何成员;它们以实现定义的方式映射到执行字符集的成员

第 10 段首先描述了包括类型描述的语义:

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