Тип индекса массива в С++

Каков тип индекса массива на языке программирования С++? Например, в таком выражении:

int tab[5];

К какому типу 5 преобразуется? или, может быть, это просто int?

Ответ 1

В этом коде 5 является просто литералом простого целого, поэтому здесь просто просто int.

§8.3.4. Массивы в n3290 (~ С++ 11) задают объявления массива:

В объявлении T D, где D имеет вид

D1 [ constant-expressionopt ] attribute-specifier-seqopt

а тип идентификатора в объявлении T D1 - это "тип-тип-тип-декларатор-тип T", тогда тип идентификатора D является типом массива; если тип идентификатора D содержит автоматический тип-спецификатор, программа плохо сформирована. T называется типом элемента массива; этот тип не должен быть ссылочным типом, void, возможно, cv-qualit, тип функции или тип абстрактного класса. Если присутствует постоянное выражение (5.19), оно должно быть интегральным постоянным выражением, а его значение должно быть больше нуля.

§5.2.1. Подпись описывает, что может быть в скобках в выражениях:

Постфиксное выражение, за которым следует выражение в квадратных скобках, является постфиксным выражением. Одно из выражений должно иметь тип "указатель на Т", а другой должен иметь неперечисленное перечисление или интегральный тип. Результатом является lvalue типа "T". Тип "T" должен быть полностью определенным типом объекта. Выражение E1 [E2] идентичен (по определению) к * ((E1) + (E2))

Ответ 2

Вопрос несколько запутан. В заголовке упоминается тип индекса массива, но в вопросе вы, похоже, спрашиваете что-то еще. Вы спрашиваете о размере массива? или индекс в массив? Размер объявленного массива должен быть больше нуля; он может иметь любой интегральный тип: int, char, signed char, unsigned int и т.д. В вашем вопросе тип литерала 5 равен int.

Однако, если вы спрашиваете о типе индекса для массива, то он должен быть одним из интегральных типов. Тип индекса для массива может быть int также, поскольку он может даже быть отрицательным.

int a[10][10];

int x = a[3][-1]; //same as a[2][9]
int y = a[3][-2]; //same as a[2][8]
int z = a[3][-3]; //same as a[2][7]

Ответ 3

int tab[5]; - объявление массива.

Объявление массива принимает целочисленное постоянное выражение, значение которого больше нуля (С++ 11: §8.3.4).

§5.19.4 (n3242):

Постоянное выражение является интегральным постоянным выражением, если оно имеет интегрального или перечисляемого типа. [Примечание: такие выражения могут использоваться как (8.3.4, 5.3.4), как выражения для случая (6.4.2), как бит-поле длины (9.6),...


5 является целым литералом (§2.14.2). Его тип int.

§2.14.2 (n3242)

2 Тип целочисленного литерала является первым из соответствующего список в таблице 6, в котором может быть представлено его значение.

3 Если целочисленный литерал не может быть представлен каким-либо типом в его списке и расширенный целочисленный тип (3.9.1) может представлять его значение, он может иметь этот расширенный целочисленный тип....

Типы десятичных констант без суффикса в таблице 6: int, long int, long long int.

Ответ 4

Это int, если вы хотите использовать sufix другого типа, например:

5         // int
5u        // unsigned int
5l        // long
5ul       // unsigned long