在 C 中使用以下代码:
#include<stdio.h>
int main()
{
char c='a';
printf("%d %d",sizeof(c),sizeof('a'));
return 0;
}
生成结果1
和4
?请解释逻辑?
此外,为什么sizeof(main())
导致4
,sizeof(main)
导致1
:
#include<stdio.h>
int main()
{
printf("%d %d\n",sizeof(main), sizeof(main()));
return 0;
}
在 C ++ 中为什么sizeof('a')
会导致1,但sizeof('av')导致4?
答案 0 :(得分:8)
字符常量的类型为 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.4
和gcc
在使用clang
标志时都会对此代码发出警告,并出现如下错误:
警告:'sizeof'无效应用于函数类型[-pedantic]
for -pedantic
,因为sizeof(main())
是一个编译时运算符,并且不评估它的参数,除了在可变长度数组的情况下,结果是返回类型的大小, int < / em>在这种情况下。例如,我们可以看到live example:
sizeof
long double func()
{
return 1.0 ;
}
返回sizeof(func())
。
注意
在您的平台上16
为sizeof(int)
,但其大小为实施定义。
注2
由于4
的结果是 size_t ,sizeof
的更便携式格式说明符将为printf
。
答案 1 :(得分:4)
字符常量int
不是char
s。因此,'a'
存储在4个字节中,而不是存储在c
中,它会缩短为1,成为char
。
请注意,从技术上讲,此int
的大小取决于实现。