gpt4 book ai didi

c - 为什么 sizeof(my_arr)[0] 编译并等于 sizeof(my_arr[0])?

转载 作者:太空狗 更新时间:2023-10-29 16:14:31 27 4
gpt4 key购买 nike

为什么这段代码可以编译?

_Static uint32_t my_arr[2];
_Static_assert(sizeof(my_arr) == 8, "");
_Static_assert(sizeof(my_arr[0]) == 4, "");
_Static_assert(sizeof(my_arr)[0] == 4, "");

前 2 个断言显然是正确的,但我预计最后一行会失败,因为我的理解是 sizeof() 应该评估为整数文字,这是无法处理的作为一个数组。换句话说,它将以与以下行失败相同的方式失败:

_Static_assert(4[0] == 4, "");

有趣的是,以下代码确实无法编译(应该做同样的事情,不是吗?):

_Static_assert(*sizeof(my_arr) == 4, "");

error: invalid type argument of unary '*' (have 'long unsigned int') _Static_assert(*sizeof(my_arr) == 4, "");

如果重要的话,我使用的是 gcc 5.3.0

最佳答案

sizeof 不是函数。它是一个一元运算符,例如 !~

sizeof(my_arr)[0] 解析为 sizeof (my_arr)[0],这只是 sizeof my_arr[0]多余的括号。

这就像 !(my_arr)[0] 解析为 !(my_arr[0])

一般来说,后缀运算符在 C 语言中的优先级高于前缀运算符。 sizeof *a[i]++ 解析为 sizeof (*((a[i])++) )(后缀运算符 []++ 首先应用于 a,然后是前缀运算符 *sizeof)。

(这是 sizeof 的表达式版本。还有一个类型版本,它采用带括号的类型名称:sizeof (TYPE)。在那种情况下,parens 会是必需的,并且是 sizeof 语法的一部分。)

关于c - 为什么 sizeof(my_arr)[0] 编译并等于 sizeof(my_arr[0])?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46653406/

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