使用字符混淆sizeof的行为

Ama*_*rma 45 c sizeof

#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)

我们现在看看每个案例.

  1. ch被定义为char类型,所以非常简单.

  2. 在C中,sizeof('a')sizeof (int)字符常量的类型为整数相同.

    引用C11,

    整数字符常量具有类型int.[...]

    在C++中,字符文字具有类型char.

  3. sizeof是一个编译时运算符(当操作数是VLA时除外),因此使用表达式的类型.如前所述,所有整数字符常量都是类型int,因此int+ int+ int生成int.所以操作数的类型被视为int.

  4. "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++中应用于隐式推广整数类型的类型.

  • 很好的答案,但是对于非常小的问题,不明确的''a'+'b'+'C''是*积分促销*的一个例子,而不是*积分转换*,标准术语.(两者都是*转换*,因为这也被用作一个总括性术语.命名是......很有趣.) (2认同)

Lun*_*din 9

首先,结果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委员会顽固地拒绝修复这种语言缺陷.