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

use*_*190 4 c c++ sizeof

C中,以下代码:

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

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

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

#include<stdio.h>

int main()
{

   printf("%d %d\n",sizeof(main), sizeof(main()));
   return 0;
}
Run Code Online (Sandbox Code Playgroud)

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

Sha*_*our 8

字符常数Ç是类型的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 sizeof运算符1段说:

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

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

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

对于sizeof(main())由于sizeof是编译时操作者和不评估它的参数,除非可变长度数组的情况下,结果是作为返回类型的大小INT在这种情况下.例如,我们可以看到实例:

long double func()
{
    return 1.0 ;
}
Run Code Online (Sandbox Code Playgroud)

sizeof(func())返回16.

注意

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

笔记2

由于结果sizeof为size_t一个更便携的格式说明的printf%zu.