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

标签 c sizeof

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

_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/

相关文章:

c - 纯 C 中的异常处理

arrays - 以固定节奏分割数组并转换为 int

c - 我怎样才能像这样进行结构类型转换?

c - 语言 c - 用逗号获取几个单词

c++ - 为什么结构的 sizeof 不等于每个成员的 sizeof 之和?

c - 查找数组大小时出错

c - 这个 scanf() 有什么问题?

c - 变量在声明之前使用是怎么回事?

c++ - 使用自定义分配器减小 vector 的大小?

c - 添加偏移量时数组名称上的 sizeof 运算符