gpt4 book ai didi

c - 箭头运算符放置 C

转载 作者:行者123 更新时间:2023-12-02 18:51:12 25 4
gpt4 key购买 nike

使用此示例结构:

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;
}

截图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 运算符返回 size_t,其格式说明符为 %zu

关于c - 箭头运算符放置 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66767753/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com