为什么 sizeof 字符字面量的大小与 sizeof(char) 不同?
为什么 sizeof 字符字面量的大小与 sizeof(char) 不同?
这个程序的输出是:
sizeof( char ) = 1, sizeof 'a' = 4.
我使用gcc进行编译(clang会得到相同的结果)以及以下编译标志:
gcc -Wall -Wextra -Wswitch -pedantic -ansi -std=c11 -DDEBUG -ggdb3 -o
《规范》第6.5.3.4节第4段在http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1570.pdf上说:
引用:
4 当sizeof应用于具有char、unsigned char或signed char类型(或其限定版本)的操作数时,结果为1。
所以我希望这个操作数'a'的sizeof为1,因为'a'的类型是char,或者它自动地被“升级”为int,或者类似的东西?(我注意到如果我将'a'转换为char,那么sizeof((char)'a')就是1)。
还是我看错了标准?
为什么char字面量的sizeof与char的sizeof不同?出现这个问题的原因是因为字符常量(或者更准确地说,整型字符常量)的类型是int。C语言标准的6.4.4.4p2节描述了字符常量的定义,其中指出整型字符常量是用单引号括起来的一个或多个多字节字符的序列,例如'x'。在该序列中,元素可以是源字符集的任何成员,并以实现定义的方式映射到执行字符集的成员。
整型字符常量的语义,包括类型的描述,在第10段首次描述:
整型字符常量的类型是int。如果一个整型字符常量包含一个映射到单字节执行字符的单个字符,那么它的值是映射字符的表示解释为整数的数值。如果一个整型字符常量包含多个字符(例如'ab'),或者包含一个不映射到单字节执行字符的字符或转义序列,那么其值是实现定义的。如果整型字符常量包含一个单个字符或转义序列,那么它的值是将值为该单个字符或转义序列的char类型对象转换为int类型时的结果。
解决这个问题的方法是,如果想要得到一个字符的大小,可以使用sizeof(char)。如果想要得到一个字符常量的大小,可以使用sizeof('x'),其中'x'是一个字符常量。需要注意的是,sizeof('x')的结果是int类型的大小,而不是char类型的大小,因为字符常量的类型是int。
在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类型。
因此,sizeof char字面量和sizeof(char)不相同的原因是整数字符常量在C语言中的类型为int,而不是char。要解决这个问题,可以使用sizeof(char)
来获取char类型的大小,而不是使用sizeof('a')
。