2009-04-14 5 views
2

Я читаю о типе эквивалентности в классе программирования Языки, и я столкнулся с ситуацией на C Я не уверен.Влияние размера массива int на эквивалентность типов

Он описывает C о «Тип эквивалентности», как:

С использует форму типа эквивалентности, который падает между именем и структурной эквивалентности, и которые могут быть свободно описана как «имя эквивалентности для структур и объединений, структурных эквивалентности для всего остального ».

Так что, если у меня есть два массива разного размера, но тот же базовый тип:

typedef int A1[10]; 
typedef int A2[20]; 

Поскольку все, что мне нужно является структурной эквивалентности, может эти два считаются структурно эквивалентными? В C - размер части набора индексов массива или нет?

ответ

3

Нет, они не являются.

Вы можете попробовать sizeof(A1) и sizeof(A2) и посмотреть, что они разные.

2

Нет, они не одного типа.

В C вы не получите сообщение об ошибке, но в C++, если вы попробуете вы получите что-то ошибки, как: C2440

ошибки: «инициализации»: не может конвертировать из «Int () [ 1024]»на 'Int () [512]

Вот некоторые примеры кода

int x[1024]; 
int y[512]; 
/*Create a pointer int[1024] type*/ 
int (*px)[1024] = &x; 
/*Create a pointer int[512] type*/ 
int (*py)[512] = &y; 

int (*py2)[512] = &x; /*<---compiling error in C++ but allowed in C even know it's wrong*/ 

Даже знаю, что последняя строка разрешена в с, 2 типа считаются отличными. Кроме того, массив не совпадает с указателем на массив, но, как вы видите, объявления типов различаются.

+0

Но в моей книге говорится, что указатели структурно эквивалентны в C. Итак, если массив является указателем на n элементов, не будут ли они структурно эквивалентными тогда? – Mithrax

+0

Массив не является указателем - он может «разложить» указатель в некоторых ситуациях, но он не эквивалентен указателю –

+1

у вас слишком много медалей :-) – 2009-04-14 21:17:46

0

В исходных кодах в некоторых контекстах переменные разных типов совместимы в данном выражении, и компилятор будет вызывать достаточную магию для выполнения правильной/ожидаемой вещи, например, передать массив в качестве аргумента функции, ожидающей указатель. Однако это не означает, что макет памяти этих файлов совместим. См. Вопрос Pointer vs array in C, non-trivial difference, где я пропустил это.

Я не совсем уверен, что ваша книга означает «структурная эквивалентность», но удивляйтесь, может быть, это относится к поощрению целого числа по умолчанию (но, похоже, также включают массивы?). Но в любом случае целая реклама является очень важной проблемой, и вы должны вкладывать время в понимание. Printf ниже, должны быть выполнены в соответствии с этими правилами:

unsigned int i = 0; 
if (i < -1) { 
     printf("This line is printed!\n"); 
} 

C standard (ISO/IEC 9899:1990) содержит раздел с заголовком «обычных арифметических преобразований», определяющих поведение. Стандарт не является бесплатным (напротив, он продается довольно дорого, поскольку стандарты ISO оцениваются на странице ...), но если вы ищете этот термин, вы сможете найти полезную информацию или цитаты. Некоторые из проектов стандартов свободно доступны, однако угрожают тем, у кого большое недоверие, поскольку вы точно не знаете, что было изменено на окончательный стандарт.

+0

Действительно? У меня нет никаких проблем с этим, но в любом случае вы должны иметь возможность искать заголовок. – hlovdal