箭头运算符位置C



使用此示例结构:

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

相关内容

  • 没有找到相关文章

最新更新