#include <stdio.h>
#include <string.h>
int main(void)
{
char ch='a';
printf("sizeof(ch) = %d\n", sizeof(ch));
printf("sizeof('a') = %d\n", sizeof('a'));
printf("sizeof('a'+'b'+'C') = %d\n", sizeof('a'+'b'+'C'));
printf("sizeof(\"a\") = %d\n", sizeof("a"));
}
Run Code Online (Sandbox Code Playgroud)
该程序用于sizeof计算大小.为什么尺寸'a'不同于ch(哪里ch='a')?
sizeof(ch) = 1
sizeof('a') = 4
sizeof('a'+'b'+'C') = 4
sizeof("a") = 2
Run Code Online (Sandbox Code Playgroud)
Sou*_*osh 51
TL; DR - sizeof适用于操作数的类型.
sizeof(ch)== sizeof (char)-------------------(1)sizeof('a')== sizeof(int)--------------------(2)sizeof ('a'+ 'b' + 'c')== sizeof(int)---(3)sizeof ("a")== sizeof (char [2])----------(4)我们现在看看每个案例.
ch被定义为char类型,所以非常简单.
在C中,sizeof('a')与sizeof (int)字符常量的类型为整数相同.
引用C11,
整数字符常量具有类型
int.[...]
在C++中,字符文字具有类型char.
sizeof是一个编译时运算符(当操作数是VLA时除外),因此使用表达式的类型.如前所述,所有整数字符常量都是类型int,因此int+ int+ int生成int.所以操作数的类型被视为int.
"a"是一个由两个chars组成的数组,'a'并且0(null-terminator)(不,它不会衰减到指向数组类型的第一个元素的指针),因此其大小与具有两个char元素的数组相同.
也就是说,最后sizeof会产生类型的结果size_t,因此必须使用%zu格式说明符来打印结果.
Bat*_*eba 23
在C中,'a'是常数类型int.这是不是一个char.所以sizeof('a')将是一样的sizeof(int).
sizeof(ch)是一样的sizeof(char).(C标准保证表单中的所有字母数字常量 - 以及其他一些常量 - 'a'都可以适合a char,因此char ch='a';总是很明确.)
请注意,在C++中,'a'是一个类型的文字char ; C和C++之间的另一个区别.
在C中,sizeof("a")是sizeof(char[2])其为2 sizeof的不指使衰变数组类型的指针.
在C++中,sizeof("a")是sizeof(const char[2])其为2 sizeof的不指使 衰变数组类型的指针.
在这两种语言中,'a'+'b'+'C'是一种int在C++中应用于隐式推广整数类型的类型.
首先,结果sizeof是type size_t,应该用%zu格式说明符打印.忽略该部分并假设int是4个字节,那么
printf("sizeof(ch) %d\n",sizeof(ch)); 将在C中打印1,在C++中打印1.
这是因为char在两种语言中,每个定义的保证为1个字节.
printf("sizeof('a') %d\n",sizeof('a')); 将在C中打印4,在C++中打印1.
这是因为字符文字int在C 中是类型的,由于历史原因1),但它们char在C++ 中是类型的,因为这是常识(和ISO 14882)所指示的.
printf("sizeof('a'+'b'+'C) %d\n",sizeof('a'+'b'+'C')); 将以两种语言打印4.
在C中,结果类型int + int + int是自然的int.在C++中,我们有char + char + char.但是+会调用隐式类型提升规则,所以最后我们最终都会int结束.
printf("sizeof(\"a\") %d\n",sizeof("a")); 将以两种语言打印2.
字符串文字"a"是char[]C和const char[]C++中的类型.在任何一种情况下,我们都有一个由一个a和一个空终止符组成的数组:两个字符.
作为旁注,发生这种情况是因为"a"当操作数到时,数组不会衰减为指向第一个元素的指针sizeof.如果我们通过例如写入来激发数组衰减sizeof("a"+0),那么我们将获得指针的大小(可能是4或8).
1)在黑暗时代的某个地方,没有任何类型,你写的所有东西都归结为int无论如何.然后,当Dennis Ritchie开始为C制作某种事实上的标准时,他显然决定应该始终将字符文字提升为int.然后,当C标准化时,他们说字符文字很简单int.
在创建C++之后,Bjarne Stroustrup认识到所有这些都没有多大意义,并使字符文字类型char成为应有的类型.但C委员会顽固地拒绝修复这种语言缺陷.
| 归档时间: |
|
| 查看次数: |
2459 次 |
| 最近记录: |