使用此示例结构:
typedef struct
{
uint8_t ary[2];
uint32_t val;
}test_t;
这两个代码片段在功能上是等效的:
代码段1(括号大小内的箭头操作(:
int main()
{
printf("Hello World");
printf("n %d", sizeof(((test_t *)0)->ary));
return 0;
}
代码段2(括号外的箭头操作(:
int main()
{
printf("Hello World");
printf("n %d", sizeof((test_t *)0)->ary);
return 0;
}
如果ary的大小发生变化,两者都会报告正确的值,但我不明白外括号示例是如何工作的:
sizeof((test_t *)0) // Using memory address 0 as pointer to test_t. size of pointer should be 4 on 32 bit system
因此,狙击2中的外侧箭头操作应等效于:
4->ary or *4.ary
那么,为什么snip 2的编译和运行与snip 1 相同呢
Expected output: 2
引用N1570 6.5.3一元运算符:
Syntax 1 unary-expression: postfix-expression ++ unary-expression -- unary-expression unary-operator cast-expression sizeof unary-expression sizeof ( type-name ) _Alignof ( type-name )
如您所见,接受表达式的sizeof
运算符不需要括号。
因此CCD_ 2和CCD_。
请注意,printf("n %d", sizeof(((test_t *)0)->ary));
无效(调用未定义的行为(,因为使用了错误的格式说明符。CCD_ 5用于打印CCD_。sizeof
运算符返回size_t
,其格式说明符为%zu
。