这里发生了什么? sizeof(short_int_variable + char_variable)

时间:2013-05-07 09:59:10

标签: c variables sizeof

#include <stdio.h>
 int main()        
{

           short int i = 20;

            char c = 97;

            printf("%d, %d, %d\n", sizeof(i), sizeof(c), sizeof(c + i));
            return 0;
}

有人告诉我当sizeof(a + b)“a是短int类型&amp; b是char类型”时会发生什么     输出为:2,1,4

5 个答案:

答案 0 :(得分:8)

由于C的标准integral promotion rules,表达式c + i的类型为int,这就是为什么你得到的等价物sizeof (int)

请注意,sizeof不是函数,只有在命名类型and to resolve precendence conflicts时才需要括号。你的代码应写成:

printf("%zu, %zu, %zu\n", sizeof i, sizeof c, sizeof (c + i));

sizeof的最终用法有括号,因为sizeof+更紧密,说sizeof c + i会被解析为(sizeof c) + i,这不是理想的结果

另请注意,它大部分时间都是编译时构造,表达式实际上从未被计算过。所有这一切都是编译器“假装”来评估它,找出表达式的类型,然后给出该类型值的大小。实际价值永远不需要存在,有时候很整洁。

sizeof返回的值类型为size_t,使用%zu打印(不是int)。

答案 1 :(得分:4)

1) sizeof(i) ==> sizeof(short int) = 2

2) sizeof(c) ==> sizeof(char) = 1

3) sizeof(c + i [97+20]) ==> sizeof(int) = 4 // result in constant value which is int as default 

答案 2 :(得分:1)

正如其他人所说,sizeof是在编译时计算的。

这里,表达式c + i整数的值,因为c和i被提升(整数提升)到int,因此

sizeof( c + i )

在32位机器上给你4个字节..

答案 3 :(得分:0)

sizeof仅在编译时工作以获取表达式的大小。

以下实际上不会增加​​'c':

c = sizeof(++ c);

表达式sizeof(a + b)将返回最大类型,其中unsigned具有优先级

答案 4 :(得分:0)

a的数据类型是“short int”。 -32768~ + 32767

c的数据类型是“char”。 0~255

当您添加到c时,它不是 short int ,也不是 char ,它变为 int

以下是一个示例代码,可帮助您获取可变数据类型:

#include <typeinfo>

int main()
{
    short int a = 1;
    char c = 'A';
    std::cout << typeid(a + c).name() << std::endl;

    return 1;
}