请考虑以下代码段:
struct foo {
int a;
int b;
int c;
};
struct foo f;
printf("%u, %u\n", sizeof(struct foo), sizeof(f));
代码返回相同的值,但我想知道应用于变量的sizeof()是否正确或者这只是巧合?
感谢。
答案 0 :(得分:6)
两者都会且应该确实返回相同的值。
来自MSDN:
运营商的尺寸
sizeof运算符给出了存储操作数类型对象所需的存储量(以字节为单位)。此运算符允许您避免在程序中指定与机器相关的数据大小。
sizeof unary-expression
sizeof ( type-name )
答案 1 :(得分:5)
sizeof
适用于类型和表达式。将其应用于某种类型后,()
属于sizeof
语法的一部分:sizeof(type)
。将其应用于表达式时()
不属于sizeof
语法:sizeof expression
。
所以你的第二个sizeof
并没有真正“应用于变量”。它适用于表达式(f)
。该表达式由包含在f
冗余对中的单个变量()
组成。您也可以不使用()
的冗余对,只使用sizeof f
。
当sizeof
应用于表达式时,它返回表达式结果的大小(即表达式具有的类型的大小)。在您的示例中,sizeof
的两个应用程序都保证评估为相同的值。
事实上,良好的编程习惯是尽可能避免使用sizeof(type)
,即更喜欢使用sizeof expression
。这使您的代码更加独立于类型,这总是一件好事。类型名称属于声明而不是其他任何地方。
答案 2 :(得分:1)
这是预期的,即两者都将返回相同的值。该值在编译时计算。
在sizeof
中使用变量通常是一种很好的做法,因为您可能会在以后更改类型,因此大小也可能会发生变化。
答案 3 :(得分:0)
通常,最好将其应用于变量。如果变量的类型发生变化,它将保持正确。