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

时间:2013-11-11 12:49:46

标签: c++ c sizeof

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 %d\n",sizeof(main), sizeof(main()));
   return 0;
}

C ++ 中为什么sizeof('a')会导致1,但sizeof('av')导致4?

2 个答案:

答案 0 :(得分:8)

C 中的

字符常量的类型为 int ,但 C ++ 中不是这种情况。来自draft C99 standard部分6.4.4.4 字符常量 10 表示(强调我的):

  

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

来自draft C++ standard部分2.14.3 字符文字 1 表示(强调我的):

  

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

因此av多字符文字,其大小为 int

对于问题的第二部分,sizeof(main)不是有效的代码,尽管编译器可能会选择仍然生成一个结果,它将是实现定义,来自草案C99标准部分{ {1}} sizeof运算符 1 表示:

  

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

草案C ++标准有类似的措辞,6.5.3.4gcc在使用clang标志时都会对此代码发出警告,并出现如下错误:

  

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

for -pedantic,因为sizeof(main())是一个编译时运算符,并且不评估它的参数,除了在可变长度数组的情况下,结果是返回类型的大小, int < / em>在这种情况下。例如,我们可以看到live example

sizeof

long double func() { return 1.0 ; } 返回sizeof(func())

注意

在您的平台上16sizeof(int),但其大小为实施定义

注2

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

答案 1 :(得分:4)

字符常量int不是char s。因此,'a'存储在4个字节中,而不是存储在c中,它会缩短为1,成为char

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