字符常量和函数名称的 sizeof() 背后的逻辑

Logic behind sizeof() for character constants and function names

本文关键字:背后 sizeof 函数 字符常量      更新时间:2023-10-16

C中使用以下代码:

#include<stdio.h>
int main()
{
   char c='a';
   printf("%d %d",sizeof(c),sizeof('a'));
   return 0;
}

产生结果14?请解释一下逻辑?

另外,为什么sizeof(main())会导致4sizeof(main)会导致1

#include<stdio.h>
int main()
{
   printf("%d %dn",sizeof(main), sizeof(main()));
   return 0;
}

C++为什么sizeof('a')结果为 1,而 sizeof('av') 的结果是 4?

C 中的字符常量属于 int 类型,尽管在 C++ 中并非如此。从C99标准草案部分6.4.4.4字符常量10段说(强调我的):

整数字符常量的类型为 int。整数字符常量的值 包含映射到单字节执行字符的单个字符是 解释为整数的映射字符的表示形式的数值。 包含多个字符的整数字符常量的值(例如, 'ab')[...]

从草案C++标准部分2.14.3字符文字1段说(强调我的):

[...]包含可在执行字符集中表示的单个 c-char 的普通字符文本具有 char,[...]包含多个 c-char 的普通字符文本是多字符文本。多字符 文本或包含单个 c-char 的普通字符文本在执行字符集中不可表示,受条件支持,具有 int 类型,并具有实现定义的值。

所以av是一个多字符文字,大小为 int

对于问题的第二部分,sizeof(main)不是有效的代码,尽管编译器可以选择仍然产生一个结果,它将实现定义,从C99标准草案部分6.5.3.4 运算符的大小1段说:

sizeof 运算符不得应用于具有函数类型或 不完整类型, [...]

C++ 标准草案具有类似的措辞,并且在使用 -pedantic 标志时,gccclang 都警告此代码,错误如下:

警告:对函数类型"sizeof"的应用无效 [-pedantic]

对于sizeof(main()),由于sizeof是一个编译时运算符并且不计算它的参数,除非在可变长度数组的情况下,结果是返回类型的大小,在这种情况下为 int。例如,我们可以看到实时示例:

long double func()
{
    return 1.0 ;
}

sizeof(func())返回16 .

注意

在您的平台上,sizeof(int)4但大小是实现定义的

注2

由于sizeof的结果是size_t printf更便携的格式说明符将是%zu

字符常量是 int s 而不是 char s。所以'a'以4个字节存储,比存储在c中时,它被缩短为1成为char

请注意,从技术上讲,此大小的int取决于实现。