字符常量和函数名称的 sizeof() 背后的逻辑
Logic behind sizeof() for character constants and function names
在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 %dn",sizeof(main), sizeof(main()));
return 0;
}
C++为什么sizeof('a')
结果为 1,而 sizeof('av') 的结果是 4?
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
运算符的大小第1段说:
sizeof 运算符不得应用于具有函数类型或 不完整类型, [...]
C++ 标准草案具有类似的措辞,并且在使用 -pedantic
标志时,gcc
和 clang
都警告此代码,错误如下:
警告:对函数类型"sizeof"的应用无效 [-pedantic]
对于sizeof(main())
,由于sizeof
是一个编译时运算符并且不计算它的参数,除非在可变长度数组的情况下,结果是返回类型的大小,在这种情况下为 int。例如,我们可以看到实时示例:
long double func()
{
return 1.0 ;
}
那sizeof(func())
返回16
.
注意
在您的平台上,sizeof(int)
是4
但大小是实现定义的。
注2
由于sizeof
的结果是size_t printf
更便携的格式说明符将是%zu
。
字符常量是 int
s 而不是 char
s。所以'a'
以4个字节存储,比存储在c
中时,它被缩短为1成为char
。
请注意,从技术上讲,此大小的int
取决于实现。
- "std::unique_XXX"命名约定背后的基本原理是什么?
- 共享指针和具有自定义删除程序的唯一指针之间的语法差异背后的任何原因
- 如何使我的 sizeof sum 结构与空参数包一起工作
- 同一对象的"sizeof"的不同答案
- std::背后的基本原理assignable_from可能的实现
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 为什么 sizeof 在 C++ 中给出不正确的字节数?
- sizeof(size_t) 可以小于 sizeof(int) 吗?
- 传递背后的原因 通过引用C++中的函数?
- 字符串数组上的 sizeof 运算符以 C++ 为单位给出不同的输出
- 为什么 sizeof(ar)/ sizeof(ar[0]) 在传递给函数时无法在向量上正常工作?
- 无法理解代码背后的逻辑,这是在两个给定数字之间生成素数的优化问题
- 嵌套循环背后的逻辑
- std::set<Key,Compare,Allocator>::find() 函数使用"<"运算符而不是"=="运算符背后的直觉是什么?
- while(sline >> n >> c && c== ',')背后的逻辑是什么?
- 为什么 MSVC _count_of实现将 0 添加到 sizeof 的结果中?
- alignas() 对 sizeof() 的影响 - 强制性的?
- 在C++中,运算符 sizeof 返回什么数据类型?
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 字符常量和函数名称的 sizeof() 背后的逻辑