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
由于sizeof
is size_t的结果,因此更便携的格式说明符printf
是%zu
.