为什么将值直接传递给sizeof操作符时,数据类型的大小不一样?

j s*_*j s 15 c int sizeof

#include <stdio.h>
int main() {
    char a = 'A';
    int b = 90000;
    float c = 6.5;
    printf("%d ",sizeof(6.5));
    printf("%d ",sizeof(90000));
    printf("%d ",sizeof('A'));
    printf("%d ",sizeof(c));
    printf("%d ",sizeof(b));
    printf("%d",sizeof(a));
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

输出是:

8 4 4 4 4 1
Run Code Online (Sandbox Code Playgroud)

为什么相同值的输出不同?

dbu*_*ush 18

常量和变量一样,也有自己的类型:

  • 6.5 : 类型的浮点常量 double
  • 90000: 类型的整数常量int(如果int是 32 位)或long(如果int是 16 位)
  • 'A' : intC 和charC++中类型的字符常量

打印出来的尺寸是上述类型的尺寸。

此外,sizeof运算符的结果类型为size_t。因此,在打印要使用的正确格式说明符时,使用 is %zu,而不是%d.


Vla*_*cow 8

C 中的字符常量(与 C++ 相反)具有类型int. 所以这个电话

printf("%d",sizeof('A'));
Run Code Online (Sandbox Code Playgroud)

输出 4. 即sizeof( 'A' )等于sizeof( int )

来自 C 标准(6.4.4.4 字符常量)

10整数字符常量的类型为 int ....

另一方面(6.5.3.4 sizeof 和 alignof 运算符)

4 当 sizeof 应用于具有 char、unsigned char 或 signed char 类型(或其限定版本)的操作数时,结果为 1。

所以sizeof这个表达式中运算符的操作数sizeof( 'A' )的类型是 int 而在这个表达式sizeof( a )中 a 被声明为

char a = 'A';
Run Code Online (Sandbox Code Playgroud)

操作数的类型为char

注意像这样的调用

printf("%d",sizeof(6.5));
Run Code Online (Sandbox Code Playgroud)

使用不正确的转换格式说明符。你必须写

printf("%zu",sizeof(6.5));
Run Code Online (Sandbox Code Playgroud)

同样在上面的调用中double,在这个调用中使用了一个类型的常量

printf("%zu",sizeof(c));
Run Code Online (Sandbox Code Playgroud)

变量c的类型为float

如果第一次调用使用 float 类型的常量,则这些调用可以获得相同的结果

printf("%zu",sizeof(6.5f));
Run Code Online (Sandbox Code Playgroud)