将值直接传递给sizeof运算符时,为什么数据类型的大小不同?


15
#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;
}

输出为:

8 4 4 4 4 1

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


12
6.5不是浮标,而是double
NathanOliver

printf("%d",sizeof(6.5f));使它成为一个float
约翰尼·莫普

2
“为什么这里的输出不同?” 为什么应该一样?您可以将一个分配给另一个的事实并不意味着它们具有完全相同的类型。
斯拉瓦

5
格式说明符应为,例如printf("%zu", sizeof(6.5));
Weather Vane,

Answers:


9

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

printf("%d",sizeof('A'));

输出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';

操作数具有类型char

注意这样的通话

printf("%d",sizeof(6.5));

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

printf("%zu",sizeof(6.5));

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

printf("%zu",sizeof(c));

变量c具有类型float

如果第一个调用使用的是float类型的常量,则这些调用可能会得到相同的结果

printf("%zu",sizeof(6.5f));

19

常量像变量一样,具有自己的类型:

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

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

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


1

因为值与无关紧要sizeof。这是类型的大小。

  • 字符常量是ints,而不是chars。

  • 浮点常量默认为doubles,除非您用f或后缀l

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.