8
#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 is short int type & b is char type" 输出是:2、1、4 时会发生什么吗

4

5 回答 5

8

由于 C 的标准积分提升规则,表达式的类型c + iint,所以这就是你得到等价的sizeof (int).

请注意,这sizeof不是函数,括号仅在命名类型和解决优先级冲突时才需要。你的代码可以写成:

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

的最终使用sizeof有括号,因为sizeof绑定比 更紧密+,说sizeof c + i将被解析为(sizeof c) + i不是所需的结果。

另请注意,大多数情况下它是一个编译时构造,从未实际评估过表达式。所发生的一切是编译器“假装”评估它,找出表达式的类型,然后给你该类型值的大小。实际值永远不需要存在,这有时很整洁。

sizeofis返回的值的类型,size_t使用%zu(it's not int) 打印。

于 2013-05-07T10:06:04.150 回答
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 
于 2013-05-07T10:03:36.437 回答
1

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

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

sizeof( c + i )

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

于 2013-05-07T10:08:56.923 回答
0

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

以下内容实际上不会增加​​“c”:

c = sizeof(++c);

表达式 sizeof(a + b) 将返回无符号优先的最大类型

于 2013-05-07T10:03:18.163 回答
0

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

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

当您将 a 添加到 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;
}
于 2013-05-07T10:07:38.830 回答