4

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?

4

2 回答 2

8

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 的 sizeof 运算符1段说:

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

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

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

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

long double func()
{
    return 1.0 ;
}

sizeof(func())返回16。_

笔记

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

笔记2

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

于 2013-11-11T12:52:53.863 回答
4

字符常量int不是chars。so'a'存储在 4 个字节中,比存储在 中时c缩短为 1 成为char.

请注意,从技术上讲,这个ints 的大小取决于实现。

于 2013-11-11T12:53:11.973 回答