为什么这段代码可以编译?
_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/