Использование спирального правила в аргументе командной строки - PullRequest
2 голосов
/ 20 сентября 2011

В чем разница между приведенными ниже декларациями?

char *argv[];

и

char *(argv[]);

Я думаю, что это то же самое по спиральному правилу.

Ответы [ 3 ]

3 голосов
/ 20 сентября 2011

Как написано, круглые скобки не имеют значения.

Так называемое спиральное правило выпадает из этого простого факта грамматики Си: постфиксные операторы, такие как () и [], имеют более высокий приоритет, чем унарные операторы, такие как *, поэтому выражения как *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
2 голосов
/ 20 сентября 2011

Да, они одинаковы.char *(argv[]) по-прежнему означает массив указателей.

char (*argv)[] будет отличаться, поскольку означает указатель на массив char.

1 голос
/ 20 сентября 2011
  1. argv[] не является типом, поэтому (argv[]) не может быть объявлением функции - это операция приоритета.
  2. Используя спиральное правило, мы сначала находим [] (приоритет или нет), а затем *, как мы делаем с *argv[], поэтому они равны.
...