箭头运算符放置 C

Arrow operator placement C

使用此示例结构:

typedef struct
{
    uint8_t ary[2];
    uint32_t val;
}test_t;

这两个代码片段在功能上是等价的:

截图 1(sizeof 括号内的箭头操作):

int main()
{
    printf("Hello World");
    printf("\n %d", sizeof(((test_t *)0)->ary));

    return 0;
}

Snip 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 运算符不需要括号。

因此sizeof(((test_t *)0)->ary)sizeof((test_t *)0)->ary都有效。

请注意,printf("\n %d", sizeof(((test_t *)0)->ary)); 无效(调用 未定义的行为 ),因为使用了错误的格式说明符。 %d 用于打印 intsizeof 运算符 returns size_t 其格式说明符是 %zu.