Как написано, круглые скобки не имеют значения.
Так называемое спиральное правило выпадает из этого простого факта грамматики Си: постфиксные операторы, такие как ()
и []
, имеют более высокий приоритет, чем унарные операторы, такие как *
, поэтому выражения как *f()
и *a[]
анализируются как *(f())
и *(a[])
.
Итак, учитывая относительно сложное выражение, такое как
*(*(*foo)())[N]
анализируется как
foo -- foo
(*foo) -- is a pointer (parens force grouping)
(*foo)() -- to a function
(*(*foo)()) -- returning a pointer (parens force grouping again)
(*(*foo)())[N] -- to an array
*(*(*foo)())[N] -- of pointer