这里发生了什么? 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
返回的值的sizeof
是size_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; }