#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
答案 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;
}