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

#include  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类型&b是char类型时会发生什么”输出是:2,1,4

由于C的标准整数提升规则 ,表达式c + i的类型是int ,因此这就是你得到sizeof (int)的等价物的原因。

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

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

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

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

sizeof返回的值的sizeofsize_t ,使用%zu打印(它不是int )。

 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 

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

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

 sizeof( c + i ) 

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

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

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

c = sizeof(++ c);

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

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

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

添加到c时,它既不是short int也不是char ,它变成int

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

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