В чем разница между typedef int array [3] и typedef int (array) [3]?
Недавно я столкнулся с этим неортодоксальным способом определения типа массива int:
typedef int(array)[3];
Сначала я подумал, что это массив указателей на функции, но потом я понял, что теги *
и ()
отсутствуют, поэтому, посмотрев на код, я понял, что массив типов был вместо типа int[3]
. Обычно я объявляю этот тип следующим:
typedef int array[3];
Если я не ошибаюсь, что это не одно и то же, в чем преимущество этого в первом случае, кроме как сделать их похожими на указатель на функцию?
Ответы
Ответ 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]<<" ";
Оба этих двух типа кода генерируют один и тот же вывод. Это доказывает, что оба они одинаковы, а круглые скобки не влияют.