sizeof与chars的混淆行为

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

在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])
是2
sizeof
不会导致数组类型衰减为指针

在C++中,<代码> SIEZOF(“A”)< /COD> >代码> SIEZOF(const char(2))< /COD> 2。code>sizeof不会导致数组类型衰减为指针


两种语言中,<代码> a′+'b++'c/<代码>是 int 类型,在C++中,对积分类型进行隐式推广。

< P> <强> 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)
    相同,因为字符常量的类型为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。

    首先, SigeOs的结果是类型<代码> siZeSt,应该用 %ZU/COD>格式说明符打印。忽略该部分并假设
    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。
      

      这是因为字符文字是C中的代码类型<代码> int >代码>,但在C++中它们属于类型<代码> char < />代码,因为这是常识(和ISO 14882)的命令。

    • printf(“sizeof('a'+'b'+'C)%d\n”),sizeof('a'+'b'+'C')将以两种语言打印4

      在C语言中,
      int+int+int
      的结果类型自然是
      int
      。在C++中,我们有<代码> char + char + char < /C>。但是+会调用,所以不管怎样,我们最终都会得到
      int

    • printf(“sizeof(\“a\”)%d\n”,sizeof(“a”)将以两种语言打印2

      <字符串>文字>代码>“a”/>代码> C++中的代码> > char []/COD> C和<代码> const char []/COD>。在这两种情况下,我们都有一个由
      a
      和空终止符组成的数组:两个字符

      作为旁注,发生这种情况是因为当操作数指向
      sizeof
      时,数组
      “a”
      不会衰减为指向第一个元素的指针。如果我们通过例如写入
      sizeof(“a”+0)
      ,引发数组衰减,那么我们将得到指针的大小(可能是4或8)


    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