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

C中 ,以下代码:

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

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

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

 #include int main() { printf("%d %d\n",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说:

sizeof运算符不应用于具有函数类型或不完整类型的表达式,[…]

C ++标准草案有类似的措辞,当使用-pedantic标志时, gccclang警告这段代码,错误如下:

警告:将’sizeof’无效应用于函数类型[-pedantic]

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

 long double func() { return 1.0 ; } 

sizeof(func())返回16

注意

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

笔记2

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

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

请注意,从技术上讲,这个int的大小是依赖于实现的。