sizeof与chars的混淆行为
在C语言中,sizeof与chars的混淆行为,c,sizeof,C,Sizeof,在C语言中,'a'是int类型的常量。它不是一个字符。因此sizeof('a')将与sizeof(int)相同 sizeof(ch)与sizeof(char)相同。(C标准保证所有字母数字常量和一些其他形式的'a'都可以放入char,因此char ch='a';总是定义良好的。) 注意,在C++中, 'a’/COD>是一个文字类型: char < /> >;C和C++的另一个区别。 在C语言中,sizeof(“a”)是sizeof(char[2])是2sizeof不会导致数组类型衰减为指针 在C
'a'
是int
类型的常量。它不是一个字符。因此sizeof('a')
将与sizeof(int)
相同
sizeof(ch)
与sizeof(char)
相同。(C标准保证所有字母数字常量和一些其他形式的'a'
都可以放入char
,因此char ch='a';
总是定义良好的。)
注意,在C++中,<代码> 'a’/COD>是一个文字类型:<代码> char < /> >;C和C++的另一个区别。
在C语言中,sizeof(“a”)
是sizeof(char[2])
是2sizeof
不会导致数组类型衰减为指针
在C++中,<代码> SIEZOF(“A”)< /COD> >代码> SIEZOF(const char(2))< /COD> 2。code>sizeof不会导致数组类型衰减为指针
两种语言中,<代码> a′+'b++'c/<代码>是
sizeof
对操作数的类型起作用
==sizeof(ch)
------------(1)sizeof(char)
==sizeof('a')
------------------(2)sizeof(int)
==sizeof('a'+'b'+'c')
--(3)sizeof(int)
==sizeof(“a”)
------------(4)sizeof(char[2])
ch
被定义为char
类型,因此非常简单sizeof('a')
与sizeof(int)
相同,因为字符常量的类型为integer
引用C11
整型字符常量的类型为int
。[……]
<>在C++中,字符文字有类型<代码> char < /> > sizeof
是编译时运算符(操作数为VLA时除外),因此使用表达式的类型。与前面一样,所有整数字符常量的类型都是int
,因此int
+int
+int
产生int
。因此,操作数的类型被视为int
“a”
是由两个char
s、'a'
和0
(空终止符)组成的数组(不,它不会衰减为指向数组类型的第一个元素的指针),因此大小与具有两个char
元素的数组相同也就是说,最后,
sizeof
生成类型为size\t
的结果,因此必须使用%zu
格式说明符来打印结果。我假设代码是用C编译的。在C语言中,
'a'
被视为int
类型,int
的大小为4。
在C++中,代码< > ''/c> >被当作<代码> char < /C> >类型,如果您尝试在cpp.sh中编译代码,则返回1。 首先,
int
为4字节,则
printf(“sizeof(ch)%d\n”,sizeof(ch))代码>将在C中打印1,C++中打印1。 这是因为在两种语言中,每个定义的
都保证为1字节char
printf(“sizeof('a')%d\n”,sizeof('a'))代码>将在C中打印4,C++中打印1。
这是因为字符文字是C中的代码类型<代码> int >代码>,但在C++中它们属于类型<代码> char < />代码,因为这是常识(和ISO 14882)的命令。
printf(“sizeof('a'+'b'+'C)%d\n”),sizeof('a'+'b'+'C')代码>将以两种语言打印4 在C语言中,
的结果类型自然是int+int+int
。在C++中,我们有<代码> char + char + char < /C>。但是+会调用,所以不管怎样,我们最终都会得到int
int
printf(“sizeof(\“a\”)%d\n”,sizeof(“a”)代码>将以两种语言打印2 <字符串>文字>代码>“a”/>代码> C++中的代码> > char []/COD> C和<代码> const char []/COD>。在这两种情况下,我们都有一个由
和空终止符组成的数组:两个字符 作为旁注,发生这种情况是因为当操作数指向a
时,数组sizeof
不会衰减为指向第一个元素的指针。如果我们通过例如写入“a”
,引发数组衰减,那么我们将得到指针的大小(可能是4或8)sizeof(“a”+0)
1) 在黑暗时代的某个地方,没有类型,你写的所有东西都可以归结为
int
无所谓。然后,当丹尼斯·里奇开始为C编写某种事实上的标准时,他显然决定字符文本应该总是提升到int
。后来当C被标准化时,他们说字符文字就是int
<> P>创建C++时,Bjarne Stroustrup认识到所有这些都没有多大意义,使字符文本类型<代码> char < /代码>应该是。但是C委员会顽固地拒绝修复这个语言缺陷。正如其他人提到的,C语言标准将字符常量的类型定义为
int
。其历史原因是C及其前身B最初是在具有不同字长的DEC PDP小型计算机上开发的,该小型计算机支持8位ASCII,但只能在寄存器上执行算术运算。早期版本的C将int
定义为机器的本机字长,任何小于int
的值都需要扩展到int
,以便传递给函数或从函数传递,或以位逻辑方式使用
#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"));
}
sizeof(ch) = 1
sizeof('a') = 4
sizeof('a'+'b'+'C') = 4
sizeof("a") = 2