Подтвердить что ты не робот

В чем разница между typedef int array [3] и typedef int (array) [3]?

Недавно я столкнулся с этим неортодоксальным способом определения типа массива int:

typedef int(array)[3];

Сначала я подумал, что это массив указателей на функции, но потом я понял, что теги * и () отсутствуют, поэтому, посмотрев на код, я понял, что массив типов был вместо типа int[3]. Обычно я объявляю этот тип следующим:

typedef int array[3];

Если я не ошибаюсь, что это не одно и то же, в чем преимущество этого в первом случае, кроме как сделать их похожими на указатель на функцию?

4b9b3361

Ответ 1

В чем разница между typedef int array[3] и typedef int(array)[3]?

Они одинаковы.


Круглые скобки могут использоваться, когда объявляется указатель, с * и приводятся к различным типам. В этом случае скобки могут влиять на приоритет [] или int. Однако это не ваш случай.

Ответ 2

Они оба эквивалентны. Скобки не меняют приоритет [] или int в этом случае.

Инструмент cdecl помогает подтвердить это:

  • int (a)[3] дает "объявить как массив 3 из int"
  • int a[3] дает "объявить как массив 3 из int"

Ответ 3

Если вы запустите этот код следующим образом:

typedef int array[6];

array arr={1,2,3,4,5,6};
for(int i=0; i<6; i++)
     cout<<arr[i]<<" ";

И теперь вы запускаете этот код следующим образом:

typedef int (array)[6];
array arr={1,2,3,4,5,6};
for(int i=0; i<6; i++)
     cout<<arr[i]<<" ";

Оба этих двух типа кода генерируют один и тот же вывод. Это доказывает, что оба они одинаковы, а круглые скобки не влияют.